案例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:然后我尝试了以下内容,但它阻止了用户界面并且仍然是顺序的
Parallel.For(0, 100, a => RetrieveRecordSet<TestClass3>());
有没有办法在WPF应用程序中获得与案例1相同的非阻塞并行行为?
答案 0 :(得分:0)
尝试以下方法:
Await Task.Run(() =>
{
Parallel.For(0,100, ()=> RetrieveRecordSet<>());
}
答案 1 :(得分:0)
Parallel.For确实是一个阻塞操作。如果您希望Parallel.For循环在与UI不同的线程上运行:
new Thread(() => Parallel.For(0, 100, index => RetrieveRecordSet<TestClass3>())).Start();
或者
new Task(() => Parallel.For(0, 100, index => RetrieveRecordSet<TestClass3>())).Start();
答案 2 :(得分:0)
感谢大家的回答。最后,答案更加邪恶,我仍然不确定问题是什么,但我找到了一个解决方法。底层代码正在进行WCF服务调用。使用任务并行库在第一次使用通道时进行一系列并行WCF调用,将序列化这些调用。我偶然发现,如果你首先用一个调用来“填充”通道,等待响应,然后用一堆并行的WCF调用来抨击它,那么你就可以获得完全的并行性。是否有一种不那么hacky可能正确的方式来补充WCF频道?这是WCF或TPL中的错误吗?