什么是c#异步编程中的伪任务?

本文关键字:任务 编程 异步 什么 | 更新日期: 2023-09-27 18:09:16

在一篇关于c#异步编程的讨论中,作者实事求是地谈到了"傀儡任务"。它出现在堆栈溢出的不同地方。但它只是被使用过,从未被解释过。这里有一些例子,在这里,在这里,在这里,在《c# 5.0中的Async》一书中提到了它。

我应该如何看待编程中的木偶任务或木偶?这是在暗示什么模型吗?任务包装器还是什么?
谢谢你。

什么是c#异步编程中的伪任务?

在c#中创建Task之前,微软已经实现了其他创建异步事件的方法。一种是事件-异步模式(EAP),其中在异步事件完成时触发回调方法。另一种是异步编程模型(APM),它使用IAsyncResult和Begin/End样式方法。

当基于任务的异步模式(TAP)被添加时,微软做出了一致的努力,在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");