【问题标题】:Parallel.ForEach finally clauseParallel.ForEach finally 子句
【发布时间】:2012-05-03 13:57:00
【问题描述】:

我想知道是否有可以在Parallel.ForEach 中使用的finally

try
{
}
finally
{
}

这在Parallel.ForEach 中是否可行?

循环完成后我需要做一个 finally。

Parallel.ForEach(someList, x =>
{
    //...
}, // Now i need to do a finally);

我的问题是我终于尝试了我的 Parallel.ForEach,但我不希望 finally 发生。它只能在并行任务完成时发生。

所以这对我不起作用:

try
{
   Parallel.ForEach(someList, x =>
   {
      //...
   });
}
finally
{
}

是否有其他方法可以做到这一点?

【问题讨论】:

    标签: c# .net c#-4.0 parallel-processing


    【解决方案1】:

    循环和finally 不能一起使用(可能在Python 中除外)。您只需编写代码以在循环之后运行,好吧,在循环之后。

    如果你想运行它而不考虑循环中的异常,这样做:

    try
    {
       Parallel.ForEach(...)
    }
    finally
    {
       // ...
    }
    

    再想一想,也许 OP ment 使用了这个 Parallel.ForEach overload,它允许你提供一个“localFinal”动作,只要一个线程(用于执行循环的另一个迭代)有完成。

    【讨论】:

    • 作为一个解释,它起作用的原因是 Parallel.ForEach 阻塞当前线程直到所有操作都完成,不像启动一个线程,它立即返回控制。
    • 抱歉,但很不清楚您所说的“我不希望最终发生”或“任务完成时”是什么意思。 (1) 如果你不想要finally,就不要写一个。 (2) 你使用Parallel 类从Task 类中抽象出来(假设你实际上指的是那个)。
    • 你的第二个想法是正确的。 =) 所以这有过载吗?你也许有我的例子吗?
    • @Willem 检查我链接到的 MSDN 页面。他们在底部/附近提供了一个示例
    【解决方案2】:

    您可以将try .. finally 块放在并行执行的操作内,或者在它之外:

    Parallel.ForEach(someList, x =>
    {
        try
        {
        }
        finally
        {
        }
    });
    

    或:

    try
    {
        Parallel.ForEach(someList, x =>
        {
        });
    }
    finally
    {
    }
    

    这取决于您的用例,这在问题中并不清楚。

    【讨论】:

    • 在这种情况下,后一种情况有效 - 请参阅 Tim S 对 Christian K 的回答的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多