2014-02-25 68 views
0

什麼是.NET中最好的同步原語/模式,等待未知數量的線程/任務完成後立即阻止任何新的執行?等待未知數量的任務,然後阻止任何新的任務

基本上類似於任務集合AddWaitForAllThenDisposeWaitForAllThenDispose允許在等待期間添加新任務並正確等待所有這些任務。

但是,只要所有活動任務都完成並且沒有對Add的併發調用,它就會處理並阻止添加任何新任務。

回答

0

模式我在此刻結束:

public class ActionScheduler { 
    private readonly CountdownEvent _allCompleted = new CountdownEvent(1); 
    private volatile bool _disposed; 

    public void Schedule(Action action) { 
     if (_disposed) 
      throw new ObjectDisposedException("ActionScheduler"); 

     // this feels ugly: 
     try { 
      _allCompleted.AddCount(); 
     } 
     catch (InvalidOperationException) { 
      // should only happen after the dispose/wait has completed 
      throw new ObjectDisposedException("ActionScheduler"); 
     } 

     ScheduleInternal(() => { 
      try { 
       action(); 
      } 
      finally { 
       _allCompleted.Signal(); 
      } 
     }); 
    } 

    private void ScheduleInternal(Action action) { 
     // some async scheduling irrelevant to the example 
    } 

    public void Dispose() { 
     if (_disposed) 
      return; 

     _allCompleted.Signal(); // removing initial +1 
     _allCompleted.Wait(); 
     _disposed = true; 
    } 
} 
+0

我能想到的唯一的變化是讓'_disposed'揮發性以防止交叉線程緩存讀取。 –

+0

@ScottChamberlain好的一點,昨天我已經考慮過了,但決定反對它,因爲它沒有增加安全性。但今天我認爲這是一個好主意。 –