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 循环中使用,但这没关系,因为它仍然不是你原来的主线程,如果你明白我的意思的话。