C# 如何摆脱迫不及待的';无效';在C中#
下面是我的示例应用程序如何探索C# 如何摆脱迫不及待的';无效';在C中#,c#,async-await,task-parallel-library,c#-6.0,C#,Async Await,Task Parallel Library,C# 6.0,下面是我的示例应用程序如何探索async/await&TPL class Program { static async void Main(string[] args) { Console.WriteLine("Order for breakfast"); Breakfast obj = new Breakfast(); Task t1 = Task.Run(() => obj.MakeTea()); Tas
async/await
&TPL
class Program
{
static async void Main(string[] args)
{
Console.WriteLine("Order for breakfast");
Breakfast obj = new Breakfast();
Task t1 = Task.Run(() => obj.MakeTea());
Task t2 = Task.Run(() => obj.ToastBread());
Task t3 = Task.Run(() => obj.BoilEgg());
Console.WriteLine("Breakfast ready");
var res = await Task.WaitAll(t1, t2, t3); // LOE - throwing error
}
}
class Breakfast
{
//making a tea
public string MakeTea()
{
return "tea";
}
//toasting bread
public string ToastBread()
{
return "bread";
}
//boil eggs
public string BoilEgg()
{
return "egg";
}
}
at#LOE编译器将生成错误作为
不能等待空虚
我的问题是
谢谢 首先,您应该将三个较小的任务声明为
Task
,而不是Task
,否则您将无法在res
中获得任何内容。当然,如果您不需要res
中的任何内容,这也不是问题
这里更重要的问题是您应该使用而不是WaitAll
。前者返回一个任务
或任务
,供您等待,而后者仅等待任务完成(如果任务尚未完成)。由于您在这里等待,因此应在所有时使用
因此,您的代码应该是:
Task<string> t1 = Task.Run(() => obj.MakeTea());
Task<string> t2 = Task.Run(() => obj.ToastBread());
Task<string> t3 = Task.Run(() => obj.BoilEgg());
Console.WriteLine("Breakfast ready");
var res = await Task.WhenAll(t1, t2, t3);
// res will contain tea, bread and egg, in some order.
taskt1=Task.Run(()=>obj.MakeTea());
Task t2=Task.Run(()=>obj.ToastBread());
Task t3=Task.Run(()=>obj.BoilEgg());
控制台。WriteLine(“早餐准备就绪”);
var res=等待任务时(t1、t2、t3);
//res将按一定顺序包含茶、面包和鸡蛋。
将Main方法的返回类型从static async void Main(string[]args)
更改为static async
TaskMain(string[]args)
@Dennis1679,只需检查相同的错误它的Task即可await@Dennis1679这是完全错误的。我提到它只是为了防止OP得到错误的信息。您只能等待一个任务或实现可等待模式的东西。Void不会返回任何东西,因此没有什么可以等待。你描述的死锁是另一回事。@Crowcoder你完全正确。我现在看到了我写的错误。我把两种不同的东西混在一起了。谢谢你通知我。为了纠正我之前的评论:我想警告OP使用async void作为返回类型,然后从其中调用异步任务。因为在某些情况下,如果异步void中的任务失败,则无法从中恢复。你的申请已经失效了,是的。正确,谢谢!但是想知道在什么情况下我应该使用.WaitAll()@kgnweb来同步等待它们。这就像调用每个任务一样。@Kgn-web如果你能帮助它,就永远不要:)@GabrielLuci,你是什么意思?@Kgn-web如果可能的话,你应该这样做,而且几乎总是这样。使用wait Task.wheall
总是比使用Task.WaitAll
好。