gpt4 book ai didi

c# - Parallel.For 不使用我的主线程

转载 作者:行者123 更新时间:2023-11-30 13:56:28 24 4
gpt4 key购买 nike

在我的应用程序中,我希望我的主线程不被其他任何东西使用。我必须做一些我希望由不同线程完成的并行处理。为此,我使用 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 将始终阻塞,直到一切都完成 - 所以即使它没有在原始线程上做任何事情,线程仍然不会“免费”。

如果你想让主线程保持“空闲”,你可能想研究异步和等待 - 你可以使用 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 循环中使用,但这没关系,因为它仍然不是您的原始主线程,如果您明白我的意思的话。

关于c# - Parallel.For 不使用我的主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28253140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com