【发布时间】:2018-07-16 06:35:58
【问题描述】:
我一直在开发一个应用程序,我需要以并行方式而不是阻塞方式运行一些方法。首先我使用了 Task.Run,但在 IN DEBUG MODE 中,我看到操作阻塞并等待结果。我不想要这个,我想要在 foreach 循环中调用的所有方法异步运行。
public async void f()
{
foreach (var item in childrenANDparents)
{
await Task.Run(() => SendUpdatedSiteInfo(item.Host,site_fr));
// foreach loop does not work until the task return and continues
}
}
所以我将 task.run 更改为 thread.start,效果很好!
public async void f()
{
foreach (var item in childrenANDparents)
{
Thread t = new Thread(() => SendUpdatedSiteInfo(item.Host, site_fr));
t.Start();
// foreach loop works regardless of the method, in debug mode it shows me
// they are working in parallel
}
}
你能解释一下有什么区别吗?为什么?我期望两个代码的行为相同,而且它们似乎不同。
谢谢
【问题讨论】:
-
await确实如其所说,等待比赛 -
哦,我不知道,我只是认为它是异步运行的,所以如果它等待它不能并行?我如何通过任务执行它?
-
这需要
Parallel.ForEach(),而不是await Task.Run()。 await 阻止了你。 -
所以我误解了 async await 的概念,
-
它将异步运行,但只到下一次等待。因此,如果您想同时异步运行一个方法,您可以使用
var foo = Task.Run(() => Foo()); Bar(); await foo;。现在 Foo 与 Bar 并肩运行并在 await 处重新同步。话虽如此,如果您想并行运行多个东西,请使用 Parallel.For/ForEach 它将找到要使用的适当数量的线程,甚至在不同负载的情况下相应地调整它们。
标签: c# multithreading task