方法和一组方法之间的同步



我有一个名为FooBar的对象,它公开了N个Foo方法和一个关闭方法。Foo方法获取一些数据,Close处理对象(如果所有Foo方法正在运行,则基本上会中止它们)。Foo方法可以并行运行(多线程支持)。

我希望只有在完成所有Foo方法之后才能工作。为此,我在所有 Foo 和 Close 方法中添加了一个锁定对象。通过这种方式,我确保在 Foo 操作正在进行时 Close 不会成功。

使用上述同步设计,我失去了并行运行 Foo 方法的能力。

是否有任何设计模式/方法可以解决上述问题?

不要使用锁对象,只需使用标准整数成员来表示正在运行的 Foo 方法数量。

在 Foo 方法开始时递增此值,在结束时递减此值。

关闭可以检查此值为零,然后再继续。

您可以使用 TPL waitall 在运行关闭方法之前执行所有任务。我已经从MSDN(https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx)剪切粘贴了一些代码。

    Task<int>[] tasks = new Task<int>[n];
    for (int i = 0; i < n; i++)
    {
        tasks[i] = Task<int>.Factory.StartNew(action, i);
    }

上面的代码排列了所有任务,因此您可以很好地将它们替换为Facotry.StartNew(yourmethodcall,i)中的方法调用

创建所有任务后,可以调用 wait all 来完成任务的执行。一旦等待所有被调用,程序将等待所有任务执行完成。

Task.WaitAll(tasks);

在这行代码之后,您可以调用 close 方法来执行其余操作。

最新更新