0
什麼是.NET中最好的同步原語/模式,等待未知數量的線程/任務完成後立即阻止任何新的執行?等待未知數量的任務,然後阻止任何新的任務
基本上類似於任務集合Add
和WaitForAllThenDispose
。 WaitForAllThenDispose
允許在等待期間添加新任務並正確等待所有這些任務。
但是,只要所有活動任務都完成並且沒有對Add
的併發調用,它就會處理並阻止添加任何新任務。
什麼是.NET中最好的同步原語/模式,等待未知數量的線程/任務完成後立即阻止任何新的執行?等待未知數量的任務,然後阻止任何新的任務
基本上類似於任務集合Add
和WaitForAllThenDispose
。 WaitForAllThenDispose
允許在等待期間添加新任務並正確等待所有這些任務。
但是,只要所有活動任務都完成並且沒有對Add
的併發調用,它就會處理並阻止添加任何新任務。
模式我在此刻結束:
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;
}
}
我能想到的唯一的變化是讓'_disposed'揮發性以防止交叉線程緩存讀取。 –
@ScottChamberlain好的一點,昨天我已經考慮過了,但決定反對它,因爲它沒有增加安全性。但今天我認爲這是一個好主意。 –