2012-12-27 14 views
5

.NET'da üç zamanlayıcı türü olduğunu biliyorum (bkz. Comparing the Timer Classes in the .NET Framework Class Library). Ana iş parçacığı meşgulse diğer türlerin sürüklenebileceğinden dişli bir zamanlayıcı seçtim ve güvenilir olmak için buna ihtiyacım var.Konsol uygulamamı, çıkmadan başka bir iş parçacığındaki bir arka plan işlemini çalıştırmak için nasıl alabilirim?

Bu zamanlayıcının zamanlayıcının denetiminde çalıştığı yol, başka bir iş parçacığı üzerine konur; böylece her zaman işin, meşgul olmadığında ana iş parçacığı üzerinde tamamlanmaya başlamasıyla birlikte işaretlenebilir.

Bir konsol uygulamasında bu zamanlayıcıyla ilgili sorun, zamanlayıcı başka bir iş parçacığı boyunca ilerlerken ana iş parçacığı uygulamanın kapanması için hiçbir şey yapmamaktır.

while true döngüsünü eklemeyi denedim, ancak zamanlayıcı kapanırsa ana iş parçacığı çok meşgul.

+5

Sen tarafından tüketilmektedir saat döngüsü feragat edebilir 'ederken' Thread.Sleep (100) ekleyerek TRUE döngü 'döngü içinde. Tüm bunları yapmak için daha iyi bir yol olsa da, Windows Hizmeti oluşturmak gibi. –

cevap

4

Tüm iş parçacıkları tamamlanana kadar bekleyen bir Bariyer kullanırdım. Bir ana ve bir sayım ipliği olduğundan, 2 katılımcım var. Yani bu gibi bir şey olacaktır:

Module Module1 
     Dim x As New Threading.Thread(AddressOf tick) 
     Dim y As New Threading.Barrier(2) 

     Sub Main() 
      x.IsBackground = True 
      x.Start() 
      y.SignalAndWait() 
     End Sub 

     Sub tick() 
      Threading.Thread.Sleep(10000) 
      y.SignalAndWait() 
     End Sub 
    End Module 
+2

Bu gerçekten bir şey yapar mı, yoksa bir "Sleep()" çağrısı ile sonsuz bir döngü için ne kadar miktardır? [Threading.Barrier belgeleri] (http://msdn.microsoft.com/en-us/library/system.threading.barrier.aspx), Bariyer sınıfının * "birden çok görevi işbirliği içinde bir algoritma üzerinde birlikte çalışmasını sağladığını belirtir. Birden fazla faza paralel. "Burada", "herhangi bir yerde", "paralel" veya "çoklu fazları" görmüyorum. –

+0

Aslında bunun Bariyerin çok basit ve iyi açıklayıcı kullanımı olduğunu düşünüyorum. Ana iş parçacığı ve diğer iş parçacığı işbirliği içinde çalışır. Sadece basit olduğu için işbirlikçi çalışmadığı anlamına gelmez. Bir diğer nokta ise, Bariyer, daha fazla karmaşık duruma (daha fazla iş parçacığına ya da her ms değerinde vb.) Uyan herhangi bir ek kaynak maliyeti olmadan, aynı miktarda kodu "bir döngü içinde" Sleep() "öneriniz olarak alır. . Böylece, "beklemek" yerine "engelleme" kullanılması bana bunu yapmanın daha uygun bir yolu gibi görünüyordu. – theGD

İlgili konular