2012-06-21 17 views
30

tôi có phương pháp sau đó được kích hoạt khi một ngoại lệ xảy ra trong một phần của ứng dụng của tôi MetroTôi có quyền bỏ qua cảnh báo trình biên dịch vì thiếu sự chờ đợi cho cuộc gọi không đồng bộ này không?

void Model_ExceptionOccured(Exception ex) 
{ 
    var dlg = new Windows.UI.Popups.MessageDialog("An exception occured during verification: " + ex.Message, "Exception"); 
    dlg.ShowAsync(); 
} 

Các 'dlg.ShowAsync()' - gọi là không đồng bộ, nhưng tôi không quan tâm chờ đợi kết quả. Trình biên dịch sẽ tạo ra một cảnh báo cho nó mặc dù:

Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

Tôi có nên quan tâm? Có lý do nào tôi nên thêm từ khóa chờ đợi, ngoài việc loại bỏ cảnh báo không?

Trả lời

27

Theo liên kết dưới đây, câu trả lời được đưa ra bởi alexm là không chính xác. Các ngoại lệ được ném trong khi cuộc gọi không đồng bộ không được chờ đợi sẽ bị mất. Để loại bỏ cảnh báo này, bạn nên gán giá trị trả về Tác vụ của cuộc gọi không đồng bộ cho một biến. Điều này đảm bảo bạn có quyền truy cập vào bất kỳ ngoại lệ nào được ném, sẽ được chỉ ra trong giá trị trả lại.

http://msdn.microsoft.com/en-us/library/hh965065(v=vs.110).aspx (VB.NET)

http://msdn.microsoft.com/en-us/library/hh873131.aspx (C#)

+0

Trong VS2012 họ đã thay đổi chính sách mặc định cho ngoại lệ nhiệm vụ không được giám sát. Hành vi mặc định là chấm dứt quá trình. – alexm

+0

liên kết bạn cung cấp hiển thị lỗi cụ thể của VB. Bạn có tham khảo tương tự cho C#? – alexm

+0

http://msdn.microsoft.com/en-us/library/hh873131.aspx là tham chiếu C#. – poke

6

Vấn đề với điều đó là nếu mã trong dlg.ShowAsync(); ném một ngoại lệ, nó sẽ bị hủy bỏ và sẽ được ném lại sau bởi chuỗi kết thúc có khả năng khiến chương trình của bạn bị chấm dứt.

gì xảy ra trong thực tế phụ thuộc vào NET chính sách ngoại lệ

This article trên MSDN đề cập đến điều này:

Nếu bạn không chờ đợi vào một nhiệm vụ mà truyền một ngoại lệ, hoặc truy cập vào bất động sản ngoại lệ của nó , ngoại lệ được leo thang theo chính sách ngoại lệ .NET khi tác vụ được thu thập rác.

Khi VS 2012 cuối cùng được chuyển, chính sách mặc định cho các ngoại lệ nhiệm vụ chưa được thay đổi đã thay đổi từ quá trình chấm dứt để bỏ qua ngoại lệ.

-1

Tôi chạy vào cùng một vấn đề, và đây là giải pháp của tôi:

Tôi tạo ra một đối tượng công tác, phân công sản lượng của async với đối tượng Task và sử dụng Timer để định kỳ kiểm tra trạng thái của nhiệm vụ.

Dưới đây là một ví dụ ngắn gọn: (trong xử lý sự kiện Update_Click của tôi)

StatusLabel.Text = "Preparing " + feedArticleList1.Feed.Title; 
UpdateCheck.Enabled = true; 
UpdateTask = feedArticleList1.Feed.UpdateFeedAsync(); 

Sau đó, trong xử lý sự kiện cho timer của tôi, tôi kiểm tra UpdateTask.Status:

switch (UpdateTask.Status) 
{ 
    case TaskStatus.Canceled: 
    case TaskStatus.Created: 
    case TaskStatus.Running: 
    case TaskStatus.WaitingForActivation: 
    case TaskStatus.WaitingForChildrenToComplete: 
    case TaskStatus.WaitingToRun: 
     StatusLabel.Text = UpdateTask.Status.ToString(); 
     break; 
    case TaskStatus.RanToCompletion: 
     StatusLabel.Text = "Update Complete " + DateTime.Now.ToShortTimeString(); 
     UpdateCheck.Enabled = false; 
     break; 
    case TaskStatus.Faulted: 
     throw (UpdateTask.Exception); 
    default: 
     break; 
} 
+1

Bạn có thể sử dụng nhiệm vụ Exception và ContinueWith cho cùng một hiệu ứng - có vẻ như bạn đang tái phát minh ra bánh xe, đặc biệt là giới thiệu bỏ phiếu lên các phương thức không đồng bộ. – Mathieson

Các vấn đề liên quan