2011-10-27 24 views
21

Bu, .Net 4'te Görev API'si kullanılarak çalıştırılması gereken bir arka plan iş parçacığı için iyi bir tasarım mı? Tek endişem, bu görevi nasıl iptal edeceğimi görmek istiyorsak mı? Biliyorum ProgramEnding'u true'a ayarlayabilirim ancak Görev API'sinde CancellationToken olduğunu biliyorum.Best Practice LongRunning Görev oluşturma

Bu yalnızca bir örnek kod örneğidir, böylece bir iş parçacığı bir koleksiyona eklenir ve bundan başka bir iş parçacığı çıkarılır. Bu program çalışırken iken sürekli çalışıyor olması gerekiyor olarak görev LongRunning olarak kurulduğundan

private void RemoveFromBlockingCollection() 
{ 
    while (!ProgramEnding) 
    { 
     foreach (var x in DataInQueue.GetConsumingEnumerable()) 
     { 
      Console.WriteLine("Task={0}, obj={1}, Thread={2}" 
          , Task.CurrentId, x + " Removed" 
          , Thread.CurrentThread.ManagedThreadId); 
     } 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    DataInQueue = new BlockingCollection<string>(); 
    var t9 = Task.Factory.StartNew(RemoveFromBlockingCollection 
           , TaskCreationOptions.LongRunning); 

    for (int i = 0; i < 100; i++) 
    { 
    DataInQueue.Add(i.ToString()); 
    Console.WriteLine("Task={0}, obj={1}, Thread={2}", 
         Task.CurrentId, i + " Added", 
         Thread.CurrentThread.ManagedThreadId); 
    Thread.Sleep(100); 
    } 
    ProgramEnding = true; 
} 

GÜNCELLEME: ben hiç parçacığı getirmek DataInQueue.CompleteAdding ProgramEnding boolean kaldırıp kullanabilirsiniz bulduk son.

cevap

18

Daha önce de belirttiğiniz gibi, CancellationToken kullanabilirsiniz. bu şekilde yapın: iptal istendi eğer, jetonu sorabilir uzun koşu görevi

cancellationTokenSource.Cancel(); 

:

var cancellationTokenSource = new CancellationTokenSource(); 
Task.Factory.StartNew(RemoveFromBlockingCollection 
         , TaskCreationOptions.LongRunning 
         , cancellationTokenSource.Token); 

Ve daha sonra kodunuzda, sizinle görevi iptal edebilirsiniz

if (cancellationTokenSource.Token.IsCancellationRequested) 
+0

İş parçacığını canlı tutmak için bir boolean kullanılması en iyi uygulamadır veya API çağrısı var mı? Bir BlockingCollection üzerinde CompleteAdding yöntemini kullanabileceğimi buldum, ancak BlockingCollection kullanmıyorsam ve başka bir şey yapsam boole güvenilir olabilir mi? – Jon

+0

Evet, işe yarayacaktı. Ya da yukarıda bahsettiğim CancellationToken kullanıyorsunuz. – Fischermaen

+0

Ben sadece bir iş parçacığı tutmak için fikrinizi soruyordum iş parçacığı iptal etmek için kullanabilir miyim? – Jon

İlgili konular