C#异步编程中的木偶任务是什么?

时间:2015-08-23 18:13:50

标签: c# asynchronous

在讨论C#中的异步编程时,作者实际上讲的是"木偶任务"。它出现在堆栈溢出的各个地方。但它只是使用,从未解释过。以下是一些示例,其中提到了hereherehere以及C#5.0中的Async一书。

我应该如何制作编程中的木偶任务或木偶?它是否表明了一些模型?任务包装或什么? 谢谢。

1 个答案:

答案 0 :(得分:2)

在C#中创建Task之前,Microsoft已经实现了创建异步事件的其他方法。一个是事件 - 异步模式(EAP),其中异步事件完成时会触发回调方法。另一个是异步编程模型(APM),它使用IAsyncResult和开始/结束样式方法。

当添加基于任务的异步模式(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)转换为可以与async / await一起使用的东西,通过创建一个简单的“木偶任务”这次活动的招标。当事件结束时,我们只是说“嘿任务也完成了”。因此,以下工作:

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