10

WF 4 için özel bir TrackingParticipant'ı uygulamaya çalışıyorum. Track yöntemini yazabilirim, ancak uygulamam yavaş olacaktır.TPL kullanarak Klasik Async Kalıbı Uygula

.NET 4.0'ın Görev Paralel Kitaplığı'nı (TPL) kullanarak Begin/EndTrack geçersiz kılmalarını nasıl uygularım? TPL and Traditional .NET Asynchronous Programming'a baktım ama nasıl uygulayacağımı bilmiyorum.

TrackingParticipant'ın .NET'in bir parçası olduğunu ve sanal yöntemleri kullanarak önceden tanımlanmış Klasik Async Paterni olduğunu unutmayın.

public class MyTrackingParticipant : TrackingParticipant 
{ 
    protected override IAsyncResult BeginTrack(
     TrackingRecord record, TimeSpan timeout, 
     AsyncCallback callback, object state) 
    { 
     // ? 
    } 

    protected override void EndTrack(IAsyncResult result) 
    { 
     // ? 
    } 

    protected override void Track(TrackingRecord record, TimeSpan timeout) 
    { 
     // synchronous code to be called 
    } 
} 

cevap

18

Bu klasik APM programlama modeli uygulamak için birlikte jenerik kalıptır: EndXXX yöntemi aslında Task ait Result özelliğini dönecekti bir sonuç döndürdü yerine sadece çağıran Eğer

protected override IAsyncResult BeginTrack(TrackingRecord record, TimeSpan timeout, AsyncCallback callback, object state) 
{ 
    Task result = Task.Factory.StartNew(
     (taskState) => 
     { 
      // ... your async work here ... 
     }, 
     state); 

    if(callback != null) 
    { 
     result.ContinueWith((t) => callback(t)); 
    } 

    return result; 
} 

protected override void EndTrack(IAsyncResult asyncResult) 
{ 
    // Call wait to block until task is complete and/or cause any exceptions that occurred to propagate to the caller 
    ((Task)asyncResult).Wait(); 
} 

Wait. Örneğin:

protected override int EndAwesomeCalculation(IAsyncResult asyncResult) 
{ 
    // This will block until the result is available and/or cause any exceptions that occurred propagate to the caller 
    return ((Task<int>)asyncResult).Result; 
} 
+0

Teşekkür ederiz! Bu çalışıyor; garip bir şekilde, iş akışı Track() tamamlanıncaya kadar hala engellenir. (Başlatma/Bitiş yöntemlerini çağırır.) İstediğim davranışı almak için bir sıra uygulamak zorundayım gibi görünüyor. (Doğru cevabınızdan kaçınmak için değil!) – TrueWill