【问题标题】:How to get value returned from async Task<string> function(); in C#如何获取从异步任务返回的值<字符串>函数();在 C# 中
【发布时间】:2017-05-23 06:02:36
【问题描述】:

我有一个异步方法,我想在它完成后从同一个方法中获取一条消息。

下面是代码

 static async Task<string> pizza()
        {
            await Task.Delay(10);
            for (int i = 0; i < 100; i++)
            {
                //Console.WriteLine("Processing pizza...");
            }
            return "Pizza is ready";

        } 

我想在呼叫点收到此消息

....... code 
Task t=null;
            switch (option)
            {
                case 1:
                    {

                        await Task.Run(() =>
                        {

                         t=pizza();// asynchronous method  

                        });
                        Console.WriteLine(t.ToString());
                    }
                    break;
 .... other code

【问题讨论】:

  • 只要使用await
  • 如果从一开始就有正确答案,您为什么接受错误答案?
  • @Eqra:您可能会发现我的async intro 很有帮助。
  • @StephenCleary,是的,先生,非常感谢,我已经去了。

标签: c# .net multithreading asynchronous


【解决方案1】:

您需要Task.Run 部分吗?你可以await 在异步方法中:

var result = await pizza();

Console.WriteLine(result);

你也可以调用result:

var result = pizza().Result;

【讨论】:

  • 它会异步运行吗?因为我已经运行了多篇文章,但我不知道何时使用 Task.run 或何时使用 await 任务。
  • @Eqra 没有歧义。 Task.Run 在后台运行一些东西。 await等待异步操作的结果。您的方法已经返回一个任务
  • :( 好吧。我试着理解,虽然我从几天前就在尝试这个!
【解决方案2】:

你可以

var pizza = await pizza();

或者

var pizza = pizza().GetAwaiter().GetResult();

【讨论】:

  • 我已经使用过类似的东西Console.WriteLine(await Task.Run(() =&gt; pizza()));
  • 这看起来很复杂,并不需要。
  • GetAwaiter 是内部方法,不应调用
【解决方案3】:

你可以使用:

var returnValue = string.Empty;
    {
        returnValue = await Pizza();
    }
    Console.WriteLine(returnValue);

它仍然会异步运行。当遇到 await 语句时,控制权将返回到主线程并且不会暂停执行。一段时间后,Pizza 方法返回执行,状态机会自动执行 returnValue 输出

您不需要使用 Task.Run 来等待。您只需要等待异步方法。然后以后你可以在任何你想使用的地方使用 returnValue。

【讨论】:

  • 不,这就是await 的用途。 .Result阻塞 直到任务返回,这是一个坏主意,除非你绝对确定任务已经完成
  • 但它不会保持异步。我想异步执行。
  • @PanagiotisKanavos 我没有说 t.Result 需要等待。我的意思是 t.Result 可以在等待方法后使用。这样,awaited 方法仍然是异步运行的,当它完成执行时我们会得到结果。
  • 那么你根本不需要.Result。只需使用 await 返回的内容。顺便说一句,您的代码将无法编译,因为 tNOT 任务。是Task的结果,即一个字符串
  • @Eqra 检查编辑后的答案。现在更详细了。代码将异步执行。这就是 async/await 所做的。我的意思是,在等待之后,您可以访问 t.result,这是从异步方法中检索值的异步方式。但绝对需要先等待,然后使用 t.Result。
【解决方案4】:

如果你等待它,它将被异步执行。如果你这样做 t.Result 它将被同步执行。

这真的取决于你需要同步还是异步执行它。

在这里,我们与所谓的专家级程序员一起投票。

尝试去掉await,放入.Result,你会得到这个:

“此异步方法缺少 'await' 运算符,将同步运行。考虑使用 'await' 运算符等待非阻塞 API 调用,或使用 'await Task.Run(...)' 执行 CPU 密集型工作在后台线程上。”

【讨论】:

  • 我想异步执行,但当我的异步方法完成处理时,我也想要一个最终消息。
  • @Eqra 这就是 await 的用途
  • .Result 不会同步执行任何操作。该任务仍将异步运行。调用线程虽然会阻塞,直到 tast 返回
  • 确实,调用.Result 根本不会改变任务的执行方式(除非任务的执行需要在调用线程上执行更多代码,当然会导致死锁)。它改变了调用.Result 的代码的行为方式。
猜你喜欢
  • 2015-02-18
  • 2017-12-16
  • 2021-04-04
  • 2018-04-09
  • 1970-01-01
  • 2014-05-20
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多