由于某种原因,任务按顺序运行

时间:2013-03-21 22:22:14

标签: c# parallel-processing

案例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相同的非阻塞并行行为?

3 个答案:

答案 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中的错误吗?