2010-09-11 19 views
12

http://msdn.microsoft.com/en-us/library/dd988458.aspxTaskFactory.StartNew() içinde "cancellationToken" nedir?

UPD:

böylece, o sırada bu makaleyi ele alalım:

static void Main() 
    { 

     var tokenSource2 = new CancellationTokenSource(); 
     CancellationToken ct = tokenSource2.Token; 

     var task = Task.Factory.StartNew(() => 
     { 

      // Were we already canceled? 
      ct.ThrowIfCancellationRequested(); 

      bool moreToDo = true; 
      Thread.Sleep(5000); 
      while (moreToDo) 
      { 

       // Poll on this property if you have to do 
       // other cleanup before throwing. 
       if (ct.IsCancellationRequested) 
       { 
        Console.WriteLine("exit"); 
        // Clean up here, then... 
        ct.ThrowIfCancellationRequested(); 
       } 

      } 
     }, tokenSource2.Token); // this parameter useless 

     Console.WriteLine("sleep"); 
     Thread.Sleep(2000); 
     Console.WriteLine("cancel"); 

     tokenSource2.Cancel(); 

     // Just continue on this thread, or Wait/WaitAll with try-catch: 
     try 
     { 
      task.Wait(); 
     } 
     catch (AggregateException e) 
     { 
      foreach (var v in e.InnerExceptions) 
      { 
       Console.WriteLine(e.Message + " " + v.Message); 
      } 
     } 

     Console.ReadKey(); 
    } 

UPD'yi: http://msdn.microsoft.com/en-us/library/dd997396.aspx

Biraz bu kodu değiştirdik Eh, Bu sadece task.IsCanceled'u değiştirir; hepsini manuel olarak uygulayın.

+0

[Görev İptalini Görün] (http://msdn.microsoft.com/en-us/library/dd997396.aspx). –

+2

Bunu gördüm. "}, tokenSource2.Token)" - bu argüman hiçbir şeyi değiştirmez. Ya bu Token'i aldık ya da almadik - bir istisna elde edecegiz, çünkü ct' kapanis tarafindan ele alinir. – zerkms

+1

Bu soruya gerçek bir cevap gelmediği için çok kötüyüm, aynı zamanda bu argümana duyulan ihtiyacı da merak ediyorum ... şimdilik tamamen işe yaramaz gibi görünüyor. –

cevap

28

Yorumlardan dolayı, başka bir yanıt gönderiyorum.

Aşağıdaki kodu düşünün:

çağrı tokenSource.Cancel() görev fiilen başlandı önce, yine parçacığı havuzundan bir iş parçacığı tahsis edeceğiz, bu nedenle birkaç sistem kaynaklarını israf edeceğiz verilmiş olsa bile
var tokenSource = new CancellationTokenSource(); 
CancellationToken ct = tokenSource.Token; 

tokenSource.Cancel(); 

var task = Task.Factory.StartNew(() => 
{  
    // Were we already canceled? 
    ct.ThrowIfCancellationRequested(); 
    // do some processing 
}); 

.

Task.Factory.StartNew'da belirteci belirtimini belirttiğinizde, bir çalışan iş parçacığı tahsis edilmeksizin görev derhal iptal edilir.

+2

Bu muhtemelen sizin adınıza yukarıda belirtilen kabul edilen cevap olmalıdır. Bir soru - geçerli görevin iptal edilen geçme kodunu almanın bir yolu var mı? Dispatcher.CurrentDispatcher eşdeğeri gibi mi? – BrainSlugs83

+2

Bu oldukça uzun bir süredir güldü. Bunu doğrulayan herhangi bir MSDN belgesi var mı? –

+1

Bkz. Http://stackoverflow.com/a/3713113/2394945 –

3

Görevlerle İptal, hala birlikte çalışır. Bazı kritik operasyonların ortasında öldürmek için bir iplik istemezsiniz. Kontrol etmelisin.

İptalTokunlar, bir işlemin kapatılması nedeniyle bir kasanın kapanmasını veya birleştirilmesini sağlayabilmeniz için örneğin ManualResetEvent gibi daha basit yapılardan daha iyidir, örneğin, genel uygulama kapatma için bir tane olabilir ve bunu belirli bir görevi iptal etmek için biriyle birleştirebilirsiniz . Görev yalnızca bir CancellationToken'a bakmak zorundadır, ancak onu CancellationTokenSource'dan iptal edebilirsiniz.

+0

Yani, bu belirteç argümanını Work() içinde nasıl alabilirim? – zerkms

+1

Eh, http://msdn.microsoft.com/en-us/library/dd780315.aspx kullanarak iletebilirsiniz, ancak kendi "TaskFactory" 'i uygulamaya başladığınızda ve iptal bildirimlerinin GERÇEK yardımcı programı devreye girer basamaklı iptal jetonları ve benzeri gibi ve daha sonra basit bir 'ManualResetEvent' veya benzeri çok daha güçlü. –

+0

@zerkms: Ayrıca, birleştirilmiş iptal çerçevesinin üst düzey bir görünümünü daha fazla veren MSDN'deki [iptal] (http://msdn.microsoft.com/en-us/library/dd997364.aspx) 'ı okuyun. Görev iptali, Görev öğelerinin nasıl iptal edildiğini anlatmaktır. "Büyük resim" iptal makalesini okursanız, faydalar daha net hale gelmelidir. –