由于某些原因,任务按顺序运行
本文关键字:顺序 运行 任务 于某些 | 更新日期: 2023-09-27 18:05:07
情况1:我有一个控制台测试应用程序和库。测试应用程序调用这些库中并行运行的类的异步方法。示例代码
for (int i = 0; i < 100; i++)
{
var myTask = RetrieveRecordSet<TestClass3>();
}
这在控制台应用程序中是预期的,这意味着所有100个任务在同一时间排队,任务在后台并行执行,由控制台输出证明。
情况2:相同的代码,只是在WPF应用程序而不是控制台应用程序中。现在由于某种原因,任务顺序运行。
案例3:我还尝试了以下修改WPF应用程序,但无济于事:
for (int i = 0; i < 100; i++)
{
var myTask = Task.Factory.StartNew(() => RetrieveRecordSet<TestClass3>());
}
案例4:然后我尝试了以下操作,但它阻塞了UI,仍然是顺序的
Parallel.For(0, 100, a => RetrieveRecordSet<TestClass3>());
是否有一种方法可以获得与WPF应用程序中案例1相同的非阻塞并行行为?
尝试如下:
Await Task.Run(() =>
{
Parallel.For(0,100, ()=> RetrieveRecordSet<>());
}
平行。For实际上是一个阻塞操作。如果你想要平行。For循环在与UI不同的线程上运行:
new Thread(() => Parallel.For(0, 100, index => RetrieveRecordSet<TestClass3>())).Start();
或
new Task(() => Parallel.For(0, 100, index => RetrieveRecordSet<TestClass3>())).Start();
谢谢大家的回答。最后,答案是更加邪恶,我仍然不确定问题是什么,但我找到了一个解决方案。底层代码正在进行WCF服务调用。使用任务并行库在第一次使用通道时进行一堆并行WCF调用,将这些调用序列化。我偶然发现,如果您首先用单个调用"启动"通道,等待响应,然后用一堆并行WCF调用猛烈地攻击它,那么您将获得完全并行性。有没有一种更合适的方式来启动WCF频道呢?这是WCF或TPL的bug吗?