我将如何在C#中访问此Task <String>返回值?

Iqr*_*ra. 3 .net c# console multithreading async-await

我正在关注@StephenHaunts的博客文章https://stephenhaunts.com/2014/10/10/simple-async-await-example-for-asynchronous-programming/#comments

在LongRunningOperation中的代码中最后一个return语句的目的是什么.

private static async Task<string> LongRunningOperation()
{
     int counter;    
     for (counter = 0; counter < 50000; counter++)
     {
         Console.WriteLine(counter);
     }    
     return "Counter = " + counter;
}
Run Code Online (Sandbox Code Playgroud)

现在我所知道的是:

  1. 当我在LongrunningOperation里面调用Task.Run它时,它应该返回默认返回的等待方法.然后为什么不这样做.

  2. 如果我使用Task.Result属性,那么它将同步运行并阻止调用线程,这是不推荐的.

我想问的是:

  1. 我如何在呼叫点打印这个返回值?

  2. 为什么@Stephen在没有需要的时候写了这个陈述?

提前致谢.

Hei*_*nzi 5

return内部代码中最后一个语句的目的是什么LongRunningOperation.

返回字符串"Counter = 50000"并演示循环已完成.这不是很有用,但显然,这是一个玩具的例子.您可以将方法声明为static async Taskstatic async Task<string>不是返回值.

当我在LongrunningOperation里面调用Task.Run它时,它应该返回默认返回的等待方法.然后为什么不这样做.

是什么让你认为它不是那样做的?以下代码段是否未返回预期结果?

string s = await Task.Run(() => LongrunningOperation());
// s should now contain "Counter = 50000".
Run Code Online (Sandbox Code Playgroud)

注意:Task.Run不带调用await将返回可能未完成的任务而不是结果.

如果我使用Task.Result属性,那么它将同步运行并阻止调用线程,这是不推荐的.

确切地说,这就是你不应该这样做的原因.

我如何在呼叫点打印这个返回值?

通过返回值做一些事情.通过将其分配给字符串(如上所示),或直接打印它:

Console.WriteLine(await Task.Run(() => LongrunningOperation()));
Run Code Online (Sandbox Code Playgroud)

为什么@Stephen在没有需要的时候写了这个陈述?

那,你要问斯蒂芬.:-)

  • 值得注意的是,严格来说,`LongrunningOperation`将始终同步运行,因为它是一个CPU绑定操作,即使包装在`Task.Run`中也是如此.唯一的区别是后者在另一个线程中执行(但同步). (3认同)
  • @Eqra从C#透视图中,`async`操作未绑定到CPU.纯异步操作通常是I/O操作(磁盘,网络等),它在等待完成时不会阻塞任何线程.Stephen在[他的博客](https://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-using.html)中使用`Task.Run`作为示例更好地解释了这一点.如果你有进一步的疑虑,你最好再创建一个问题,这个问题太广泛了,无法在评论中解释. (2认同)