Parallel.For 不要使用我的主线程
Parallel.For not to use my main thread
在我的应用程序中,我希望我的主线程不被其他任何东西使用。我必须做一些我希望由不同线程完成的并行处理。为此,我使用 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 中的任何内容始终 运行 在单独的线程上,以便主线程始终空闲。
Is there some way to make sure that anything in Parallel.For always run on separate thread so that main thread is always free.
Parallel.For
将始终阻塞,直到一切都完成 - 所以即使它 没有 在原始线程上做任何事情,线程仍然不会 "free".
如果你想保留主线程 "free" 你可能想研究异步和等待 - 你可以使用 Task.Run
在异步方法中启动 10 个任务,然后 await
调用结果 Task.WhenAll
.
或者,您仍然可以使用 Parallel.For
,但在任务中执行 that。例如:
Task task = Task.Run(() => Parallel.For(0, 10, i =>
{
Console.WriteLine("Output ->>>>>>> {0} ",
Thread.CurrentThread.ManagedThreadId);
}));
然后您可以等待 那个 任务。任务的 "main thread" 可能会在 Parallel.For
循环中使用,但这没关系,因为它仍然不是你原来的主线程,如果你明白我的意思的话。
在我的应用程序中,我希望我的主线程不被其他任何东西使用。我必须做一些我希望由不同线程完成的并行处理。为此,我使用 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 中的任何内容始终 运行 在单独的线程上,以便主线程始终空闲。
Is there some way to make sure that anything in Parallel.For always run on separate thread so that main thread is always free.
Parallel.For
将始终阻塞,直到一切都完成 - 所以即使它 没有 在原始线程上做任何事情,线程仍然不会 "free".
如果你想保留主线程 "free" 你可能想研究异步和等待 - 你可以使用 Task.Run
在异步方法中启动 10 个任务,然后 await
调用结果 Task.WhenAll
.
或者,您仍然可以使用 Parallel.For
,但在任务中执行 that。例如:
Task task = Task.Run(() => Parallel.For(0, 10, i =>
{
Console.WriteLine("Output ->>>>>>> {0} ",
Thread.CurrentThread.ManagedThreadId);
}));
然后您可以等待 那个 任务。任务的 "main thread" 可能会在 Parallel.For
循环中使用,但这没关系,因为它仍然不是你原来的主线程,如果你明白我的意思的话。