C# 如何获取异步任务返回的值<;字符串>;函数();在C中#

C# 如何获取异步任务返回的值<;字符串>;函数();在C中#,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我有一个异步方法,我希望在完成时从同一个方法获取消息 下面是代码 static async Task<string> pizza() { await Task.Delay(10); for (int i = 0; i < 100; i++) { //Console.WriteLine("Processing pizza..."); }

我有一个异步方法,我希望在完成时从同一个方法获取消息

下面是代码

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

        } 
您可以使用:

var returnValue = string.Empty;
    {
        returnValue = await Pizza();
    }
    Console.WriteLine(returnValue);
它仍将异步运行。当遇到WAIT语句时,控件将返回到主线程,并且不会暂停执行。当Pizza方法返回并执行一段时间后,状态机将自动执行returnValue输出


您不需要使用任务。只需运行等待即可。您只需要等待异步方法。之后,您可以在任何地方使用returnValue。

您是否需要
任务。运行
部分?您可以
等待
,如果您在异步方法中:

var result = await pizza();

Console.WriteLine(result);
您还可以调用结果:

var result = pizza().Result;

如果您等待它,它将异步执行。如果您不这样做。结果它将同步执行

这实际上取决于您执行同步或异步的需要

现在我们来看看所谓的专家程序员们的投票热潮

尝试删除wait、put.Result,您将得到以下结果:

此异步方法缺少“等待”运算符并将同步运行。考虑使用“Acess”操作符等待非阻塞API调用,或“等待任务.Run(…)”在后台线程上执行CPU绑定的工作。

var pizza = await pizza();


它会异步运行吗?因为我已经运行了多篇文章,但我不知道何时使用Task.run或何时使用wait Task。@Eqra没有歧义。Task.Run在后台运行一些东西<代码>等待
仅等待异步操作的结果。您的方法已返回任务:(好的。我试着去理解,虽然我已经尝试了好几天了!只要使用
wait
当一开始就有正确答案时,你接受错误答案的原因是什么?@Eqra:你可能会发现我的答案很有帮助。@StephenCleary,是的,先生,非常感谢,我已经这样做了。我想异步地去做,但是当我的异步同步方法将完成其处理。@Eqra这就是
等待
的作用。结果
不会同步执行任何内容。任务仍将异步运行。调用线程将阻塞,直到tast返回动作,调用
。结果
根本不会改变任务的执行方式(当然,除非任务的执行需要在调用线程上执行更多代码,否则会导致死锁)。它改变了调用
.Result
的代码的行为。不,这就是
等待
的目的。
.Result
将被阻止,直到任务返回,这是一个坏主意,除非您完全确定任务已经完成,但它不会保持异步。我想异步执行。@PanagiotisKanavos我没有是的,t.Result需要等待。我的意思是,t.Result可以在等待方法之后使用。这样,等待的方法仍然是异步的,我们在它完成执行后得到结果。那么你根本不需要
。Result
。只需使用
等待
返回的内容。顺便说一句,你的代码不会编译,因为
t
这不是任务,而是任务的结果string@Eqra检查编辑后的答案。现在更详细了。代码将异步执行。这就是async/await所做的。我的意思是,在await之后,您可以访问t.result,这是从异步方法检索值的异步方式。但您肯定需要先等待,然后再访问我们e t.Result.我使用了类似这样的
Console.WriteLine(wait Task.Run(()=>pizza());
这看起来很复杂,不必要。
GetAwaiter
是内部方法,不应该被调用
var pizza = await pizza();
var pizza = pizza().GetAwaiter().GetResult();