2010-05-31 14 views
5

System.Threading.Tasks ad alanındaki yeni iş parçacıklı yapıları kullanarak iptal edilebilir bir çalışan iş parçacığı uygulamaya çalışıyorum. Şimdiye kadar bu uygulama ile geldi adres:İptal edilebilir çalışan iş parçacığı nasıl uygulanır

public sealed class Scheduler 
{ 
    private CancellationTokenSource _cancellationTokenSource; 
    public System.Threading.Tasks.Task Worker { get; private set; } 

    public void Start() 
    { 
     _cancellationTokenSource = new CancellationTokenSource(); 

     Worker = System.Threading.Tasks.Task.Factory.StartNew(
      () => RunTasks(_cancellationTokenSource.Token), 
      _cancellationTokenSource.Token 
     ); 
    } 

    private static void RunTasks(CancellationToken cancellationToken) 
    { 
     while (!cancellationToken.IsCancellationRequested) 
     { 
      Thread.Sleep(1000); // simulate work 
     } 
    } 

    public void Stop() 
    { 
     try 
     { 
      _cancellationTokenSource.Cancel(); 
      Worker.Wait(_cancellationTokenSource.Token); 
     } 
     catch (OperationCanceledException) 
     { 
      // OperationCanceledException is expected when a Task is cancelled. 
     } 
    } 
} 

Stop() döner ben TaskStatus.Canceled olmasını Worker.Status bekliyoruz zaman.
Birim testlerim, Worker.Status belirli koşullar altında TaskStatus.Running olarak ayarlanmış olduğunu göstermiştir.

İptal edilebilir bir çalışan iş parçacığı uygulamak için bu doğru bir yöntem midir? Sadece Cancel() aradım çünkü, zaten hangi -

cevap

5

Sorun sinyal alması belirteç bekliyor

Worker.Wait(_cancellationTokenSource.Token); 

çağrınızda olduğuna inanıyoruz. Sadece

Worker.Wait(); 

ardından İnanıyorum ki değiştirirseniz RanToCompletion hal göreceksiniz. İptal Edildi'yi görmezsiniz, çünkü göreviniz OperationCanceledException'u atmıyor. Sonunda

cancellationToken.ThrowIfCancellationRequested() 

aramak için RunTasks yöntemini değiştirirseniz, o zaman AggregateExceptionStop içinde yakalamak gerekir - ama o zaman sonunda Canceled hal göreceksiniz.

En azından, benim deneylerimin gösterdiği budur :)

+0

Evet, sorunu çözdünüz. Teşekkürler. –

İlgili konular