在C#中關於異步編程的討論中作者講的是「木偶任務」的事實。它出現在堆棧溢出的各個地方。但它只是使用,從來沒有解釋。以下是一些示例,其中提到了here,here,here以及C#5.0中的Async。什麼是C#異步編程中的puppet任務?
我應該怎樣編制僞裝任務或木偶編程?它是否表示一些模型?一個任務包裝或什麼?
謝謝。
在C#中關於異步編程的討論中作者講的是「木偶任務」的事實。它出現在堆棧溢出的各個地方。但它只是使用,從來沒有解釋。以下是一些示例,其中提到了here,here,here以及C#5.0中的Async。什麼是C#異步編程中的puppet任務?
我應該怎樣編制僞裝任務或木偶編程?它是否表示一些模型?一個任務包裝或什麼?
謝謝。
在C#中創建Task
之前,Microsoft已經實現了其他創建異步事件的方法。一個是事件異步模式(EAP),當異步事件結束時觸發回調方法。另一種是使用IAsyncResult
和開始/結束樣式方法的異步編程模型(APM)。
當添加了基於任務的異步模式(TAP)時,Microsoft一致努力在BCL中添加基於任務的所有異步API的版本。但是,他們無法做所有事情,除此之外,許多第三方庫已經使用EAP或APM。同時,他們意識到使用TAP的價值和價值async
和await
帶來的。因此,他們創建了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");
您能否提供這些討論的參考? –
有一些稱爲puppet的軟件具有任務,但沒有實際的鏈接或引號或上下文,我們無法爲您明確回答。既然你說這些是堆棧溢出,你應該可以引用一個特定的例子。 –
這是一個有效的問題。不知道爲什麼它處於暫停狀態。這是一個在C#異步中使用的術語,相當重要。由於我無法發佈答案,因此我會在此回覆。它基本上是指使用TaskCompletionSource在使用其他異步模式(開始/結束,回調事件等)的API上實現任務異步模式。本質上,「其他」異步模式僅使用一個任務作爲「傀儡「做它的競標。它真的做了所有的工作,任務就在那裏,以便你可以使用TPL和異步/等待。 – dman2306