2012-06-21 6 views
30

나는 예외가 내 지하철 응용 프로그램이 비동기 호출에 대한 부족한 컴파일러 경고를 무시해도 되겠습니까?

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

'dlg.ShowAsync()'의 일부에 발생하는 경우 트리거되는 다음과 같은 방법이 - 호출이 비동기입니다,하지만 난 기다릴 상관 없어 결과. 컴파일러는 비록에 대한 경고를 생성합니다

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.

난 상관할까요? 경고를 없애기 위해 await 키워드를 추가해야하는 이유가 있습니까? dlg.ShowAsync();의 코드가이 처리되지 않은 남아있을 것입니다 예외가 발생하고 프로그램 종료의 원인이 종료 자 스레드 잠재적으로 나중에 다시 발생합니다 경우

답변

27

아래 링크에 따르면, alexm이주는 대답은 정확하지 않습니다. 기다리지 않은 비동기 호출 중에 발생하는 예외는 손실됩니다. 이 경고를 없애려면 async 호출의 Task 반환 값을 변수에 할당해야합니다. 이렇게하면 throw 된 모든 예외에 액세스 할 수 있으며 반환 값에 표시됩니다.

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

: (내 Update_Click 이벤트 처리기에서)

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

나중에 이벤트 핸들러 내 타이머, 나는 UpdateTask.Status 확인 감시되어 있지 않은 태스크 예외의 디폴트 정책. 기본 동작은 프로세스를 종료하는 것이 었습니다. – alexm

+0

제공 한 링크에 VB 관련 오류가 표시됩니다. C#에 대한 비슷한 참조가 있습니까? – alexm

+0

http://msdn.microsoft.com/en-us/library/hh873131.aspx는 C# 참조입니다. – poke

6

그게 문제입니다. 현실에서 어떻게됩니까

은 MSDN에

This article이 언급 .NET 예외 정책에 따라 달라집니다

당신은 예외를 전파 작업에서 대기, 또는 예외 속성에 액세스하지 않는 경우 작업이 가비지 수집 될 때 .NET 예외 정책에 따라 예외가 에스컬레이션됩니다.

VS 2012가 최종적으로 출하 될 때 처리되지 않은 작업 예외의 기본 정책이 프로세스 종료에서 예외 예외로 변경되었습니다.

-1

저도 같은 문제로 달리고, 여기 내 솔루션입니다 :

가 나는 작업 객체를 생성, 비동기의 출력을 할당 함수를 Task 객체에 전달하고 Timer를 사용하여 주기적으로 작업 상태를 확인합니다.

여기에 간단한 예제가있다 : 그들은 변경 VS2012에서

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

Exception 및 ContinueWith 태스크를 사용하여 동일한 효과를 얻으십시오. 특히, 비동기 메소드에 폴링을 도입 할 때 휠을 재발 명하고있는 것처럼 보입니다. – Mathieson

관련 문제