2012-04-19 13 views
5

我有以下的代碼和平:什麼是趕上「用戶取消操作」的最佳途徑異常

IAsyncResult beginExecuteReader = command.BeginExecuteNonQuery(); 

while (!beginExecuteReader.IsCompleted) 
{ 
    if (controllerTask.CancellationTokenSource.IsCancellationRequested) 
    { 
     command.Cancel(); 
    } 

    Thread.Sleep(100); 
} 

try 
{ 
    result = command.EndExecuteNonQuery(beginExecuteReader); 
} 
catch (SqlException exception) 
{ 
    if (exception.ErrorCode == OperationCanceled) 
    { 
     throw new OperationCanceledException(); 
    } 

    throw; 
} 

我如何確定,是逮住異常被取消的操作引起的。在這種情況下,ExecuteNonQuery拋出錯誤代碼爲0x80131904的異常,但這是非常普遍的異常,可能由多種原因引起。錯誤消息如下所示:{「當前命令發生嚴重錯誤,應該丟棄結果(如果有)。\ r \ n用戶取消操作。」}

我沒有看到任何選項,除解析錯誤消息...任何想法?

謝謝

PS。是的,我知道取消命令asyncronyc操作可能不是最好的想法,因爲對於.NET 2.0在MSDN上有警告,但對於.NET 4.0,此警告被刪除。我也當解除方法是從另一個線程調用不喜歡另一種實現方式,因爲對我來說,使代碼更難

+0

這是winforms嗎? – Likurg 2012-04-19 10:57:42

+0

不,這只是一個類庫,它通過ADO.NET類(.NET 4.0)與數據庫一起工作。所以我不能使用BackgroundWorker :) – and85 2012-04-19 11:02:00

+0

好吧,你會在winforms中使用你的庫?或者在哪裏? – Likurg 2012-04-19 11:14:49

回答

0

所以恕我直言,你下一步應該做的事情:

  1. 讓一個線程在那裏你會使用ado(讀取Thread example
  2. 刪除Thread.Sleep(100); // Imho從不使用它
  3. 添加到您的課程static bool muststop = false;
  4. 添加到您的類公共靜態功能改變「muststop」
  5. 更改你線程的功能,如果muststop ==真

我希望這可以幫助您

-1

您可以檢查異常消息停止在catch塊中查找哪個操作被用戶取消:

try 
{ 
    //your code 
} 
catch (SqlException ex) 
{ 
    if (ex.Message.Contain("Operation cancelled by user")) 
    { 
     //Do something here 
    } 
}