我需要同步運行一個方法列表,並能夠停止執行列表。使用重置事件執行前可以輕鬆停止循環(請參閱Execute
中的第一行)。如何編寫一個可中止的同步方法?
如何等待action.Execute()
和action.Execute()
同時響應?
private ManualResetEvent _abortingToken = new ManualResetEvent(false);
private List<IAction> _actions;
public void Abort()
{
_abortingToken.Set();
}
public void Execute()
{
foreach (var action in _actions)
{
if (_abortingToken.WaitOne(0))
break; // Execution aborted.
action.Execute(); // Somehow, I need to call this without blocking
while (/*Execute not finished*/)
{
if (_abortingToken.WaitOne(1))
action.Abort();
}
}
}
我認爲這將是很容易使用任務瓶坯,但不幸的是我使用.NET 3.5。
編輯:溶液SLaks answer啓發:
public void Execute()
{
Action execute = null;
IAsyncResult result = null;
foreach (var action in _actions)
{
execute = new Action(scriptCommand.Execute);
if (_abortingToken.WaitOne(0))
break; // Execution aborted.
result = execute.BeginInvoke(null, null);
while (!result.IsCompleted)
{
if (_abortingToken.WaitOne(10))
{
action.Abort();
break;
}
}
execute.EndInvoke(result);
}
}
謝謝。使用`BeginInvoke`創建一個非常優雅的代碼,沒有太多的開銷。但是我必須調用`EndInvoke`嗎? EndInvoke的唯一目的不是檢索返回值或異常?如果我不關心結果(即中止後)怎麼辦? – HuBeZa 2011-02-13 15:33:41
@HuBeZa:如果你不調用`EndInvoke`,你會泄漏內存。 – SLaks 2011-02-13 15:56:56