多个线程中的 For 循环
如何在另一个线程中运行每个 for 循环调用,但ExternalMethod 的继续应该等待 for 循环中最后一个工作线程的结束(并同步)?
ExternalMethod()
{
//some calculations
for (int i = 0; i < 10; i++)
{
SomeMethod(i);
}
//continuation ExternalMethod
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
一种方法是使用
ManualResetEvent
。考虑以下代码(请注意,这不应该被视为一个工作示例,因为它停留在 OSX 上,所以没有 VS 或 C# 编译器来手动检查它):
重要 - 这可能不是这不是最好的方法,只是使用
ManualResetEvent
的示例,它将完全满足您的需求。如果您使用的是 .NET 4.0,则可以使用
Parallel.For
循环 - 在此解释。One approach would be to use a
ManualResetEvent
.Consider the following code (note that this should not be taken as a working example, stuck on OSX so don't have VS nor a C# compiler to hand to check this over):
IMPORTANT - This possibly isn't the best way to do it, just an example of using
ManualResetEvent
, and it will suit your needs perfectly fine.If you're on .NET 4.0 you can use a
Parallel.For
loop - explained here.一种方法是使用
CountdownEvent
。如果 CountdownEvent 不可用,那么这里有一个替代方法。
请注意,在这两个示例中,for 循环本身都被视为并行工作项(毕竟它位于与其他工作项不同的线程上),以避免第一个工作项可能出现的非常微妙的竞争条件。工作项在下一个工作项排队之前发出该事件信号。
One approach is to use a
CountdownEvent
.If
CountdownEvent
is not available then here is an alternate approach.Note that in both examples the
for
loop itself is treating as a parallel work item (it is on a separate thread from the other work items afterall) to avoid a really subtle race condition that might occur if the first work item signals the event before the next work item is queued.对于 .NET 3.5,可能是这样的:
使用
Join()
方法可能看起来违反直觉,但由于您实际上正在执行 WaitAll 类型模式,因此连接的顺序并不重要被处决。For .NET 3.5, maybe something like this:
It may seem counterintuitive to use the
Join()
method, but since you are effectively doing a WaitAll-type pattern, it doesn't matter what order the joins are executed.