声明一个异步方法,可以等待*和*异步运行而无需等待它完成?

时间:2015-06-24 14:04:48

标签: c# async-await

假设你正在开发一个api并且想要提供异步方法,但是有可能用户实际上并不想“等待”特定的异步方法在继续下一行之前完成;有没有办法让它“火与忘”?也就是说,这样方法实际上是通过一个Task异步运行并让它继续下一行而没有“等待”?这样,如果用户想要等待它,那么他们可以,并且那些想要将其作为任务运行的人可以这样做。

2 个答案:

答案 0 :(得分:3)

(将我的评论移到答案中,因为我猜是这样)

所有异步方法都是开箱即用的。用户永远不会被迫等待任何事情。这取决于用户是否等待异步方法。你不需要做任何特殊的事情来支持这两种情况。

示例:

public async Task MyAsyncMethod() {
    // do something asynchronous in here...
}

您可以使用await

调用该方法
await obj.MyAsyncMethod();

......或不......

obj.MyAsyncMethod();

在最后一种情况下,该方法将是一场“一劳永逸”。

用户还可以选择使用您的方法执行以下操作:

Task t = obj.MyAsyncMethod();

// perform some other tasks that don't depend on the completion of "MyAsyncMethod"

await t; // now I want to await on the task before continuing.

// perform more tasks that require the completion of "MyAsyncMethod"

正如您所看到的,我不需要对我的异步方法进行任何更改以支持所有3种情况。

答案 1 :(得分:3)

您必须了解await不执行该方法。 await仅注册函数返回的Task对象中剩余函数的延续。 (实际上在Task对象的Awaiter中。)

因此,无论您是否以及如何等待它完成,该功能都在执行。您可以稍后存储Task对象和await。或者您使用Task.Wait函数等待它阻止。