2012-04-19 39 views
5

tôi đã sau hòa bình của mã:cách tốt nhất để bắt "hủy thao tác bằng cách sử dụng" là gì ngoại lệ

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; 
} 

Làm thế nào tôi có thể xác định, đó là đánh bắt ngoại lệ là do hủy hoạt động. Trong trường hợp này ExecuteNonQuery ném ngoại lệ với mã lỗi 0x80131904, nhưng nó là ngoại lệ rất chung có thể được gây ra bởi nhiều lý do. Thông báo lỗi trông như sau: {"Đã xảy ra lỗi nghiêm trọng trên lệnh hiện tại. Kết quả, nếu có, sẽ bị hủy. \ R \ nHoàn tác bị hủy bởi người dùng."}

Tôi không thấy bất kỳ tùy chọn nào ngoại trừ phân tích cú pháp thông báo lỗi ... Bất kỳ ý tưởng nào?

Cảm ơn

PS. Vâng, tôi biết rằng lệnh Hủy cho hoạt động asyncronyc có lẽ không phải là ý tưởng tốt nhất, bởi vì đối với .NET 2.0 đã có cảnh báo trên MSDN, nhưng đối với .NET 4.0, cảnh báo này bị loại bỏ. Và tôi cũng không thích việc triển khai một khi hủy bỏ phương pháp được gọi là từ thread khác, như đối với tôi nó làm cho mã khó khăn hơn

+0

Đây có phải là biểu mẫu chiến thắng không? – Likurg

+0

Không, đây chỉ là một thư viện lớp, hoạt động với cơ sở dữ liệu thông qua các lớp ADO.NET (.NET 4.0). Vì vậy, tôi không thể sử dụng BackgroundWorker :) – and85

+0

Ok, bạn sẽ sử dụng thư viện ur trong winforms? Hay ở đâu? – Likurg

Trả lời

0

Vì vậy, IMHO bạn nên làm gì tiếp theo:

  1. Thực hiện một chủ đề mà bạn sẽ sử dụng ado (đọc này Thread example)
  2. Xóa Thread.Sleep (100); // Imho không bao giờ sử dụng nó
  3. Thêm vào lớp tĩnh của bạn bool muststop = false;
  4. Thêm vào lớp chức năng public static của bạn để thay đổi "muststop"
  5. Thay đổi bạn chức năng thread để ngăn chặn nó nếu muststop == true

Tôi hy vọng điều này giúp bạn

-1

Bạn có thể nhắn tin thi ngoại lệ trong khối đánh bắt để tìm người dùng đã hủy hoạt động nào:

try 
{ 
    //your code 
} 
catch (SqlException ex) 
{ 
    if (ex.Message.Contain("Operation cancelled by user")) 
    { 
     //Do something here 
    } 
} 
Các vấn đề liên quan