SORU
9 Mart 2013, CUMARTESİ


TaskCompletionSource<T>?kullanarak gerçek hayat senaryoları

Zorlukları anlamakta güçlük çekiyorum : senaryolar, TaskCompletionSource?

AFAIK , herkes biliyor bir noktada, SetResult SetException yöntemi Task<T> Task özelliğini açığa tamamlamak için çağrılan.

Diğer bir deyişle , Task<TResult> ve onun tamamlanması için yapımcı olarak görür

here örnek gördüm

Fonksiyonel bir zaman uyumsuz olarak çalıştırmak için bir yol gerekir, ve bir Görev varsa bu işlem temsil edecek.

public static Task<T> RunAsync<T>(Func<T> function) 
{ 
    if (function == null) throw new ArgumentNullException(“function”); 
    var tcs = new TaskCompletionSource<T>(); 
    ThreadPool.QueueUserWorkItem(_ => 
    { 
        try 
        {  
            T result = function(); 
            tcs.SetResult(result);  
        } 
        catch(Exception exc) { tcs.SetException(exc); } 
    }); 
    return tcs.Task; 
}

kullanılabilecekTask.Factory.StartNew olmasaydı

Ama BenyapınTask.Factory.StartNew

Birisi örnek ile ilgili bir senaryo açıklayabilirdoğrudanTaskCompletionSource ve için değilvarsayımsalhangi Task.Factory.StartNew yok durum ?

CEVAP
9 Mart 2013, CUMARTESİ


Ben sadece bir olay apı dayalı kullanılabilir (for example windows phone 8 sockets) çoğunlukla bunu kullanın:

public Task<Args> SomeApiWrapper()
{
    TaskCompletionSource<Args> tcs = new TaskCompletionSource<Args>(); 

    var obj = new SomeApi();

    // will get raised, when the work is done
    obj.Done  = (args) => 
    {
        // this will notify the caller 
        // of the SomeApiWrapper that 
        // the task just completed
        tcs.SetResult(args);
    }

    // start the work
    obj.Do();

    return tcs.Task;
}

Birlikte c#5 async anahtar ile birlikte kullanıldığında özellikle yararlıdır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • TecNoob

    TecNoob

    15 AĞUSTOS 2013
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012
  • wwjoshdo

    wwjoshdo

    25 Mayıs 2009