C# 声明一个可以等待*和*异步运行而不必等待完成的异步方法?

C# 声明一个可以等待*和*异步运行而不必等待完成的异步方法?,c#,async-await,C#,Async Await,假设您正在开发一个api,并希望提供异步方法,但有一种可能性,即用户实际上不希望在继续下一行之前“等待”特定异步方法完成;有没有一种方法可以让它“开火然后忘记”?也就是说,使方法实际上通过一个任务异步运行,并让它在不“等待”的情况下继续下一行?这样,如果用户想要等待它,那么他们可以,而那些只想将它作为任务运行的用户也可以这样做 (将我的评论转移到答案上,因为我想是这样的) 所有异步方法都是以这种方式工作的。用户从不被迫等待任何事情。是否使用异步方法取决于用户。您不需要做任何特殊的事情来支持这两种

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

(将我的评论转移到答案上,因为我想是这样的)

所有异步方法都是以这种方式工作的。用户从不被迫等待任何事情。是否使用异步方法取决于用户。您不需要做任何特殊的事情来支持这两种情况

示例:

public async Task MyAsyncMethod() {
    // do something asynchronous in here...
}
您可以使用
wait
调用该方法:

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

(将我的评论移动到一个答案,因为我想是这样)

所有异步方法都是以这种方式工作的。用户从不被迫等待任何事情。是否使用异步方法取决于用户。您不需要做任何特殊的事情来支持这两种情况

示例:

public async Task MyAsyncMethod() {
    // do something asynchronous in here...
}
您可以使用
wait
调用该方法:

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

您必须了解,
wait
不执行该方法<代码>等待仅在函数返回的
任务
对象中注册剩余函数的继续。(实际上是在
任务
对象的等待者中)


因此,函数正在执行,无论您是否以及如何等待它的完成。您可以存储
任务
对象,然后
等待
它。或者使用
任务.wait
函数等待它阻塞。

您必须了解
等待
不会执行该方法<代码>等待仅在函数返回的
任务
对象中注册剩余函数的继续。(实际上是在
任务
对象的等待者中)


因此,函数正在执行,无论您是否以及如何等待它的完成。您可以存储
任务
对象,然后
等待
它。或者您使用
任务等待它阻塞。等待
功能。

它们都是以开箱即用的方式工作的。用户从不被迫等待任何事情。如果您只希望它是fire And forget,那么将返回类型设置为void
。但是如果您确实返回了一个
任务
,则取决于用户是否等待它。你不需要做任何特殊的事情来支持这两种情况,它们都是开箱即用的。用户从不被迫等待任何事情。如果您只希望它是fire And forget,那么将返回类型设置为void
。但是如果您确实返回了一个
任务
,则取决于用户是否等待它。您不需要做任何特殊的事情来支持这两种情况。+1但我不建议将代码
void
void
async
方法是专门为一个狭义的使用事件处理程序创建的。如果你在其他地方找到它们,通常是一个bug。参见例如和链接自的相关文章it@Damien:你说得对,在这种情况下最好不要提及这个选项。谢谢编辑出来。@Anthony-您可能还想阅读Eric Lippert的文章,这可能会消除您对
async
wait
的一些困惑。@Anthony:我明白您的意思。但是,通常,如果设计正确,方法的同步部分(在到达等待之前的部分)不会花费很长时间。那些昂贵的零件是值得期待的。如果这不是真的,那么
async
方法可能需要一个
Task.Run()
或其内部类似的东西来确保它不同步运行。@Anthony异步方法无法知道它是否被等待。当它被期待的时候,与没有被期待的时候,它的行为是不可想象的。即使您没有等待返回的任务,该方法仍将异步运行。唯一的区别是,该方法永远无法查看异步操作的结果,查看它是否出错,或者错误是什么,或者在该操作完成后可靠地执行某些代码。+1但我不建议将代码
设为void
void
async
方法是专门为一个狭义的使用事件处理程序创建的。如果你在其他地方找到它们,通常是一个bug。参见例如和链接自的相关文章it@Damien:你说得对,在这种情况下最好不要提及这个选项。谢谢编辑出来。@Anthony-您可能还想阅读Eric Lippert的文章,这可能会消除您对
async
wait
的一些困惑。@Anthony:我明白您的意思。但是,通常,如果设计正确,方法的同步部分(在到达等待之前的部分)不会花费很长时间。那些昂贵的零件是值得期待的。如果这不是真的,那么
async
方法可能需要一个
Task.Run()
或其内部类似的东西来确保它不同步运行。@Anthony异步方法无法知道它的wait