2015-01-21 55 views
0

我有一個名爲FooBar的對象,它公開了N個Foo方法和一個close方法。 Foo方法獲取一些數據並關閉對象(如果它們正在運行,則實質上會中止所有Foo方法)。 Foo方法可以並行運行(多線程支持)。方法和一組方法之間的同步

我希望只有在完成所有Foo方法後才能工作。爲此,我在所有Foo和Close方法中添加了一個鎖對象。這樣我確保關閉不成功,如果Foo操作正在進行。

通過上述同步設計,我失去了並行運行Foo方法的能力。

有沒有解決上述問題的設計模式/方法?

+0

你想使用TPL嗎? – qamar 2015-01-21 10:50:09

回答

1

而不是使用鎖對象,只需使用標準的整數成員來表示有多少Foo方法正在運行。

當Foo方法開始時將其遞增,並在結束時遞減。

關閉然後可以檢查這是零之前繼續。

+0

我曾考慮過這種方法,但整數需要用鎖來保護,因爲可以同時從多個線程調用單個Foo方法。 – sundar 2015-01-21 11:11:44

+0

好的,所以知道這一點,每個Foo方法的另一個鎖也是如何? – 2015-01-21 14:22:28

+0

可以有100個這樣的方法。 – sundar 2015-01-22 05:47:05

0

您可以使用TPL waitall在運行close方法之前執行所有任務。我已經從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)

一旦你創建了所有的任務,那麼你可以調用等全部替換它們完成任務的執行。一旦等待所有被稱爲它的程序將等待所有任務執行完成。

Task.WaitAll(tasks); 

在這行代碼之後,您可以調用close方法來完成其餘的操作。

+0

執行所有Foo方法不在我們的控制之下。它是API的一部分,可以在任何時間點執行。 – sundar 2015-01-21 11:10:43

+0

所以你的代碼是API的conumer? – qamar 2015-01-21 11:14:11

+0

不,代碼是API的一部分。 – sundar 2015-01-21 11:14:46