2015-08-23 76 views
-1

在C#中關於異步編程的討論中作者講的是「木偶任務」的事實。它出現在堆棧溢出的各個地方。但它只是使用,從來沒有解釋。以下是一些示例,其中提到了here,here,here以及C#5.0中的Async。什麼是C#異步編程中的puppet任務?

我應該怎樣編制僞裝任務或木偶編程?它是否表示一些模型?一個任務包裝或什麼?
謝謝。

+0

您能否提供這些討論的參考? –

+1

有一些稱爲puppet的軟件具有任務,但沒有實際的鏈接或引號或上下文,我們無法爲您明確回答。既然你說這些是堆棧溢出,你應該可以引用一個特定的例子。 –

+2

這是一個有效的問題。不知道爲什麼它處於暫停狀態。這是一個在C#異步中使用的術語,相當重要。由於我無法發佈答案,因此我會在此回覆。它基本上是指使用TaskCompletionSource在使用其他異步模式(開始/結束,回調事件等)的API上實現任務異步模式。本質上,「其他」異步模式僅使用一個任務作爲「傀儡「做它的競標。它真的做了所有的工作,任務就在那裏,以便你可以使用TPL和異步/等待。 – dman2306

回答

2

在C#中創建Task之前,Microsoft已經實現了其他創建異步事件的方法。一個是事件異步模式(EAP),當異步事件結束時觸發回調方法。另一種是使用IAsyncResult和開始/結束樣式方法的異步編程模型(APM)。

當添加了基於任務的異步模式(TAP)時,Microsoft一致努力在BCL中添加基於任務的所有異步API的版本。但是,他們無法做所有事情,除此之外,許多第三方庫已經使用EAP或APM。同時,他們意識到使用TAP的價值和價值asyncawait帶來的。因此,他們創建了TaskCompletionSource。這可以作爲使非TAP API與TAP協同工作的包裝器。本質上,你創造了許多人稱爲傀儡任務的東西。這是一個真正只存在於將EAP或APM(或其他異步模式)方法轉換爲TAP方法的任務。例如,假設你有一門課DownloadFile。文件完成後,該類將觸發一個DownloadComplete事件。通常你會這樣做:

DownloadFile myfile = new DownloadFile(); 
myfile.Complete += SomeMethodToHandleCompletion; 
myfile.Download(); 

然後,在某個時候,你的方法激發。這很好,但我們需要任務。所以,你可以做的是一樣的東西:

public Task<string> DownloadFileAsync(string url) 
{ 
    var tcs = new TaskCompletionSource<string>(); 
    DownloadFile myfile = new DownloadFile(url); 

    myfile.Complete += (theData) => 
    { 
     tcs.SetResult(theData); 
    }; 

    return tcs.Task; 
} 

那是因爲我沒有處理異常或任何東西,但本質上,現在我已經變成一個事件處理程序(EAP)到的東西我可以用一個簡單的例子異步/等待通過創建一個簡單地進行事件投標的「傀儡任務」。當事件結束時,我們只是說「嘿,任務也完成了」。因此,以下工作:

string downloadedFile = await DownloadFileAsync("http://www.some.url.example");