声明一个可以等待*和*的异步方法,在不等待完成的情况下异步运行

本文关键字:等待 运行 异步 情况下 异步方法 一个 声明 | 更新日期: 2023-09-27 17:59:20

假设您正在开发一个api,并希望提供异步方法,但用户可能并不想在继续下一行之前"等待"特定的异步方法完成;有没有一种方法可以让它"燃烧并忘记"?也就是说,使方法实际上通过Task异步运行,并让它继续到下一行而不"await"?这样,如果用户想等待,那么他们可以,而那些只想将其作为任务运行的用户可以这样做

(将我的评论移到一个答案上,因为我想它是)

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

示例:

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种情况。

声明一个可以等待*和*的异步方法,在不等待完成的情况下异步运行

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

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