C#Task.Run不等待操作变量
参见示例代码C#Task.Run不等待操作变量,c#,lambda,async-await,task,C#,Lambda,Async Await,Task,参见示例代码 Console.WriteLine("start") Task.Run(async () => { await Task.Delay(3000); }); Console.WriteLine("end"); // result // start [3s delay] end 它起作用了! 但下面的代码不起作用 Action action = async () => { await Task.Delay(3000); }; Console.Write
Console.WriteLine("start")
Task.Run(async () =>
{
await Task.Delay(3000);
});
Console.WriteLine("end");
// result
// start [3s delay] end
它起作用了!
但下面的代码不起作用
Action action = async () =>
{
await Task.Delay(3000);
};
Console.WriteLine("start")
Task.Run(action);
Console.WriteLine("end");
// result
// start [without delay] end
为什么Task.Run
不等待异步操作变量
编辑-------------------------
我很抱歉。我写错代码了。
这是正确的代码
我在VS2017的C#Interactive上进行了测试
Console.WriteLine("start");
await Task.Run(async () =>
{
await Task.Delay(3000);
});
Console.WriteLine("end");
Action action = async () =>
{
await Task.Delay(3000);
};
Console.WriteLine("start");
await Task.Run(action);
Console.WriteLine("end");
使用async和Tasks的主要原因是使两个或多个方法同时运行。因此,您的方法将继续运行,当完成延迟时,将调用延迟后的任何内容,因为您在任务中运行了另一个异步func 如果运行此方法,您会注意到 完成
将打印在其他工作的中间(在这里,其他工作是<代码> for循环< /代码>,
Console.WriteLine("start");
Task.Run(async () =>
{
await Task.Delay(200);
Console.WriteLine("Finished");
});
for(int i = 0; i < 500; i++)
{
Console.WriteLine(i);
}
Console.WriteLine("end");
Console.ReadKey();
Console.WriteLine(“开始”);
Task.Run(异步()=>
{
等待任务。延迟(200);
控制台。写入线(“完成”);
});
对于(int i=0;i<500;i++)
{
控制台写入线(i);
}
控制台。写入线(“结束”);
Console.ReadKey();
由于某些原因,它在dotnetfiddle上的工作效果不如预期
即使任务中没有运行异步,它们也将同时运行
看看这个例子:
Console.WriteLine("start");
Task.Run(() =>
{
Task.Delay(2000).Wait(); // Will NOT wait !
Console.WriteLine("Finished");
});
for(int i = 0; i < 500; i++)
{
Console.WriteLine(i);
}
Console.WriteLine("end");
Console.ReadKey();
Console.WriteLine(“开始”);
Task.Run(()=>
{
Task.Delay(2000).Wait();//不会等待!
控制台。写入线(“完成”);
});
对于(int i=0;i<500;i++)
{
控制台写入线(i);
}
控制台。写入线(“结束”);
Console.ReadKey();
它将毫不延迟地继续,因为它正在执行任务
但是如果您想让方法等待,首先:不要在任务上运行它。
第二:调用Wait()方法
比如:
Console.WriteLine("start");
Task.Delay(2000).Wait(); // It'll wait for 2 seconds before continue.
for(int i = 0; i < 500; i++)
{
Console.WriteLine(i);
}
Console.WriteLine("end");
Console.ReadKey();
Console.WriteLine(“开始”);
Task.Delay(2000).Wait();//它将等待2秒钟,然后继续。
对于(int i=0;i<500;i++)
{
控制台写入线(i);
}
控制台。写入线(“结束”);
Console.ReadKey();
您可以尝试以下方法:
Action action = async () =>
{
await Task.Delay(3000);
};
Console.WriteLine("start");
Task.Run(action).Wait();
Console.WriteLine("end");
当使用
任务时。在不等待的情况下运行,这只会“触发并忘记”。代码执行不会等待它,它只会在线程池中有线程时运行它
通常,如果要卸载某些工作并等待该工作完成,请创建一个单独的方法,返回任务
,然后等待
示例:
Console.WriteLine("start")
await DoWorkAsync();
Console.WriteLine("end");
/////////
private Task DoWorkAsync()
{
return Task.Run(async () =>
{
await Task.Delay(3000);
});
}
请注意,不建议将方法主体包装到任务中并返回它,这通常会导致一点代码味道
Stephen Cleary对任务
和异步/等待
有很好的了解。我会仔细阅读以下内容:
将像这样工作,但不是很明显:
Func<Task> action = async () =>
{
await Task.Delay(3000);
};
Console.WriteLine("start");
await Task.Run(action);
Console.WriteLine("end");
Func action=async()=>
{
等待任务。延迟(3000);
};
控制台写入线(“开始”);
等待任务。运行(操作);
控制台。写入线(“结束”);
不确定您在哪里测试,但第一个示例并没有等待延迟:@CamiloTerevinto抱歉,我编写了错误的代码。既然这是问题的副本,为什么应该这样做?顺便说一句:它不等待!我已经添加了。它不仅仅是副本。等待();在线#6,它对您有用,兄弟,请尝试一下不工作:)。因为您正在运行一个任务,所以它不会等待。我之前添加了一个关于您的方法的示例,阅读我的答案,您将看到为什么它不等待。@Kaj您提供的是Task.Delay(2000.wait();这和我说的完全不同,兄弟。我的代码100%工作,尽管你没有抓住要点。因为您正在运行一个任务,所以它不会等待!当我尝试它时,它不会等待。