Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于某些原因,任务按顺序运行_C#_Parallel Processing - Fatal编程技术网

C# 由于某些原因,任务按顺序运行

C# 由于某些原因,任务按顺序运行,c#,parallel-processing,C#,Parallel Processing,案例1:我有一个控制台测试应用程序和库。测试应用程序对那些库中要并行运行的类调用异步方法。示例代码 for (int i = 0; i < 100; i++) { var myTask = RetrieveRecordSet<TestClass3>(); } 这与console应用程序中的预期一样有效,这意味着所有100个任务同时排队,并且任务在后台并行执行,控制台输出证明了这一点 案例2:相同的代码,只

案例1:我有一个控制台测试应用程序和库。测试应用程序对那些库中要并行运行的类调用异步方法。示例代码

        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();