C# 如何等待完成任务。运行以完成

C# 如何等待完成任务。运行以完成,c#,.net,task,.net-4.7,C#,.net,Task,.net 4.7,我有一个程序可以处理这样的事情 var t=Task.Run(()=>process()); while(!t.IsCompleted()) Task.Delay(1000); Console.WriteLine(t.Result); 有没有其他方法可以让程序等待任务完成?这里所做的基本上是异步同步。错误的解决方法是。。。t、 等待,而不是你的循环。但是,实际上,您应该尝试使此代码异步,并改用: Console.writelineeat; 注意,如果需要,C中的Main方法可以是异步静

我有一个程序可以处理这样的事情

var t=Task.Run(()=>process());
while(!t.IsCompleted())
 Task.Delay(1000);
Console.WriteLine(t.Result);
有没有其他方法可以让程序等待任务完成?

这里所做的基本上是异步同步。错误的解决方法是。。。t、 等待,而不是你的循环。但是,实际上,您应该尝试使此代码异步,并改用:

Console.writelineeat; 注意,如果需要,C中的Main方法可以是异步静态任务Main

然而!使用Task.Run在这里并没有多大意义——这只是占用了一个池线程,并阻塞了当前线程等待它。你没有从任务中获得任何东西。快跑

如果进程是同步的:只需使用Console.WriteLineprocess 如果进程是异步的,则返回任务/ValueTask/etc:只需使用Console.WriteLineawait进程 这里所做的基本上是异步同步。错误的解决方法是。。。t、 等待,而不是你的循环。但是,实际上,您应该尝试使此代码异步,并改用:

Console.writelineeat; 注意,如果需要,C中的Main方法可以是异步静态任务Main

然而!使用Task.Run在这里并没有多大意义——这只是占用了一个池线程,并阻塞了当前线程等待它。你没有从任务中获得任何东西。快跑

如果进程是同步的:只需使用Console.WriteLineprocess 如果进程是异步的,则返回任务/ValueTask/etc:只需使用Console.WriteLineawait进程
它是自动发生的。你只需要:

var t=Task.Run(()=>process());

Console.WriteLine(t.Result);
如果一开始t.Result不可用,程序将在该点阻塞,直到计算出该值


也就是说,如果您只想等待结果,为什么要将其作为任务运行呢?

它会自动执行。你只需要:

var t=Task.Run(()=>process());

Console.WriteLine(t.Result);
如果一开始t.Result不可用,程序将在该点阻塞,直到计算出该值


也就是说,如果您只想等待结果,为什么要将其作为任务运行呢?

您有不同的选择:
您有不同的选择:

您使用Task.Run的目的是什么?你实际上是在要求另一个线程为你做一些工作,因为你的线程将很忙——然后立即转身说,在另一个线程完成之前,你的线程没有工作要做。为什么不直接调用进程并使用您已有的线程呢?这是用同步方法包装的。任务是我唯一的感觉。这里的进程是一个异步方法;t、 等待;控制台写入网结果;你使用Task.Run的初衷是什么?你实际上是在要求另一个线程为你做一些工作,因为你的线程将很忙——然后立即转身说,在另一个线程完成之前,你的线程没有工作要做。为什么不直接调用进程并使用您已有的线程呢?这是用同步方法包装的。任务是我唯一的感觉。这里的进程是一个异步方法;t、 等待;控制台写入网结果;我想我的最后一行解释了整个方法是可疑的。调用Result将阻塞,从而导致Task.Run的使用过时。使用Task.Run with synchronous code的唯一原因是保持UI线程空闲,因此应该等待生成的任务。正如我在回答中所述。您只是给出了错误的解决方案,然后说但不要这样做,并且没有真正解释原因。这不是答案。我想我的最后一行解释了整个方法是可疑的。调用结果将被阻止,从而导致Task.Run的使用过时。使用Task.Run with synchronous code的唯一原因是保持UI线程空闲,因此应该等待生成的任务。正如我在回答中所述。您只是给出了错误的解决方案,然后说但不要这样做,并且没有真正解释原因。这不是答案。