Parallel.For不使用我的主线程

时间:2015-01-31 15:15:20

标签: c# task-parallel-library parallel.foreach

在我的应用程序中,我希望我的主线程不被其他任何东西使用。我必须做一些并行处理,我想通过不同的线程来完成。为此,我使用Parallel.For如下

static void SomeMethod()
{
    Console.WriteLine(string.Format("Main Thread ID  before parallel loop ->>>>>>> {0} ", System.Threading.Thread.CurrentThread.ManagedThreadId));
    Parallel.For(0, 10, i =>
    {
        Console.WriteLine(string.Format("Output ->>>>>>> {0} ", System.Threading.Thread.CurrentThread.ManagedThreadId));
    }); 
    Thread.Sleep(100);
    Console.WriteLine(string.Format("Main Thread ID  after parallel loop ->>>>>>> {0} ", System.Threading.Thread.CurrentThread.ManagedThreadId));
}

从输出主线程可以看出使用ThreadID 1并且Parallel.For中的一些线程也使用相同的线程。

Main Thread ID  before parallel loop ->>>>>>> 1
Output ->>>>>>> 1
Output ->>>>>>> 1
Output ->>>>>>> 3
Output ->>>>>>> 4
Output ->>>>>>> 4
Output ->>>>>>> 4
Output ->>>>>>> 4
Output ->>>>>>> 5
Output ->>>>>>> 3
Output ->>>>>>> 1
Main Thread ID  after parallel loop ->>>>>>> 1

是否有某种方法可以确保Parallel.For中的任何内容始终在单独的线程上运行,以便主线程始终是空闲的。

1 个答案:

答案 0 :(得分:8)

  

是否有某种方法可以确保Parallel.For中的任何内容始终在单独的线程上运行,以便主线程始终是空闲的。

Parallel.For将一直阻止,直到所有内容都完成 - 所以即使它没有在原始帖子上做任何事情,线程仍然不会是&# 34;自由"

如果你想保持主线程"免费"您可能希望查看异步并等待 - 您可以使用Task.Run以异步方式启动10个任务,然后await调用Task.WhenAll的结果。

或者,您仍然可以使用Parallel.For但在任务中执行 。例如:

Task task = Task.Run(() => Parallel.For(0, 10, i =>
{
    Console.WriteLine("Output ->>>>>>> {0} ", 
                      Thread.CurrentThread.ManagedThreadId);
}));

然后你可以等待那个任务。 "主线程"任务可能会在Parallel.For循环中使用,但是没关系,因为如果你明白我的意思,它仍然不是你原来的主线程。