在讨论C#中的异步编程时,作者实际上讲的是"木偶任务"。它出现在堆栈溢出的各个地方。但它只是使用,从未解释过。以下是一些示例,其中提到了here,here,here以及C#5.0中的Async一书。
我应该如何制作编程中的木偶任务或木偶?它是否表明了一些模型?任务包装或什么? 谢谢。
答案 0 :(得分:2)
在C#中创建Task
之前,Microsoft已经实现了创建异步事件的其他方法。一个是事件 - 异步模式(EAP),其中异步事件完成时会触发回调方法。另一个是异步编程模型(APM),它使用IAsyncResult
和开始/结束样式方法。
当添加基于任务的异步模式(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)转换为可以与async / await一起使用的东西,通过创建一个简单的“木偶任务”这次活动的招标。当事件结束时,我们只是说“嘿任务也完成了”。因此,以下工作:
string downloadedFile = await DownloadFileAsync("http://www.some.url.example");