C# 由于某些原因,任务按顺序运行
案例1:我有一个控制台测试应用程序和库。测试应用程序对那些库中要并行运行的类调用异步方法。示例代码C# 由于某些原因,任务按顺序运行,c#,parallel-processing,C#,Parallel Processing,案例1:我有一个控制台测试应用程序和库。测试应用程序对那些库中要并行运行的类调用异步方法。示例代码 for (int i = 0; i < 100; i++) { var myTask = RetrieveRecordSet<TestClass3>(); } 这与console应用程序中的预期一样有效,这意味着所有100个任务同时排队,并且任务在后台并行执行,控制台输出证明了这一点 案例2:相同的代码,只
for (int i = 0; i < 100; i++)
{
var myTask = RetrieveRecordSet<TestClass3>();
}
这与console应用程序中的预期一样有效,这意味着所有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确实是一个阻塞操作。如果希望Parallel.For循环在UI以外的单独线程上运行,请执行以下操作:
new Thread(() => Parallel.For(0, 100, index => RetrieveRecordSet<TestClass3>())).Start();
或
谢谢各位的回答。最后,答案更加邪恶,我仍然不确定问题是什么,但我找到了一个解决办法。底层代码正在进行WCF服务调用。第一次使用通道时,使用任务并行库进行一系列并行WCF调用,将序列化这些调用。我意外地发现,如果您先用一个呼叫“启动”频道,等待响应,然后用一堆并行WCF呼叫将其关闭,那么您将获得完全并行。有没有一种不那么粗俗的方式,也许是正确的方式来启动WCF频道?这是WCF或TPL中的错误吗?RetrieveRecordSet是如何工作的?显示它如何启动任务以及任务的外观。正在运行的任务占用线程吗?
new Task(() => Parallel.For(0, 100, index => RetrieveRecordSet<TestClass3>())).Start();