C#异步调用"调用并忘记"

时间:2017-03-07 05:15:45

标签: c#

在c#中,当您在异步方法中调用await方法时,代码将从调用上下文执行到该方法。如果我想进行异步调用,直接从同一行代码继续(即使异步操作尚未完成)而不是返回到调用上下文,该怎么办?我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

根据定义,await是在继续工作流之前必须异步等待任务完成的点。如果你不必等待,那就不要等了!没有要求你等待任何事情。

你的问题就像问我一样IEnumerable<int>但是我并不关心整数是什么;我必须foreach吗?&#34;不,你不是。如果你不关心结果是什么,你就不必从序列中得到结果。如果你不关心任务的结果,你就不必等待它。

但是获取一个序列然后不枚举它是一件奇怪的事情,获得​​一个任务然后不关心它完成时会发生什么是一件奇怪的事。

答案 1 :(得分:3)

  

如果我想进行异步调用,直接从相同的代码行继续调用(即使异步操作尚未完成),而不是返回到调用上下文,该怎么办?我怎么能这样做?

最简单的方法,无论Something是同步还是异步,都能正常工作:

var _ = Task.Run(() => Something());

但是,正如Eric Lippert所说:

  

获得任务然后不关心完成时会发生什么事情是一件奇怪的事。

或者,正如我喜欢说的那样:“绝错”几乎永远你真正想要的东西。忘了&#34;忘了&#34;的意思是:

  1. 完成后你不在乎。
  2. 您不关心是否完成。例如,如果您的应用程序退出(或者在ASP.NET上回收应用程序池),那么您的后台工作就会丢失。
  3. 您不关心它是否成功完成 。例如,如果您的工作抛出异常,您希望以静默方式吞下该异常。
  4. 在实际代码中,此方案非常罕见。

答案 2 :(得分:0)

如果要启动异步方法并继续执行该功能,可以执行Task<string> getStringTask = asyncMethodThatReturnsString();之类的操作。然后继续,直到您要等待异步任务完成,此时您将调用string output = await getStringTask;