在我的应用程序中,我希望我的主线程不被其他任何东西使用。我必须做一些并行处理,我想通过不同的线程来完成。为此,我使用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中的任何内容始终在单独的线程上运行,以便主线程始终是空闲的。
答案 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
循环中使用,但是没关系,因为如果你明白我的意思,它仍然不是你原来的主线程。