2011-02-13 26 views
3

我需要同步運行一個方法列表,並能夠停止執行列表。使用重置事件執行前可以輕鬆停止循環(請參閱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); 
    } 
} 

回答

2

這是同步的對面。
您需要在後臺線程上運行該方法。

例如,您可以使用Delegate.BeginInvoke調用該方法,然後檢查IAsyncResult.IsCompleted。 (並且確保以後撥打EndInvoke

+0

謝謝。使用`BeginInvoke`創建一個非常優雅的代碼,沒有太多的開銷。但是我必須調用`EndInvoke`嗎? EndInvoke的唯一目的不是檢索返回值或異常?如果我不關心結果(即中止後)怎麼辦? – HuBeZa 2011-02-13 15:33:41

+0

@HuBeZa:如果你不調用`EndInvoke`,你會泄漏內存。 – SLaks 2011-02-13 15:56:56

0

您可以在另一個線程中運行Execute,然後您的while嘗試加入超時。

public void Execute() 
{ 
    foreach (var action in _actions) 
    { 
     if (_abortingToken.WaitOne(0)) 
      break; // Execution aborted. 

     var workThread = new Thread(action.Execute); 
     workThread.Start(); 

     while (!workThread.Join(100)) /Milliseconds, there is also a timespan overload 
     { 
      if (_abortingToken.WaitOne(1)) 
       action.Abort(); 
     } 
    } 
} 

請參閱http://msdn.microsoft.com/en-us/library/system.threading.thread_methods.aspx

相關問題