2012-05-10 2 views
0

작업 (및 작업 ::) 내에서 XAML 컨트롤에 액세스하려고하면 Metro XAML 응용 프로그램이 항상 예외로 중지됩니다. 동일한 코드는 작업 외부에서 문제없이 작동합니다. 나는 어떤 대답도 찾지 못했다. 나는 무엇을 놓쳤는가?작업 내에서 XAML 컨트롤에 예외 액세스

VS11 디버거 보고서 : 동시성 :: unobserved_task_exception

예외 : 응용 프로그램이 다른 스레드 정렬 화 된 인터페이스를했다.

많은 도움을 주셔서 감사합니다. 우리가 task_continuation_context 추가하는 경우

void MyClass::MyMemberFunction() 
{ 
    xamlStoryboard->Stop(); // ok 
    xamlImage->Source = ref new BitmapImage(); // ok 

    task<void> atask([this]() 
    { 
     xamlStoryboard->Stop(); // exception! 
     xamlImage->Source = ref new BitmapImage(); //exception! 
    }); 

    atask.then([this]() 
    { 
     xamlStoryboard->Stop(); // exception! 
     xamlImage->Source = ref new BitmapImage(); //exception! 
    }); 
} 

atask.then() 연속 코드는 예외없이 실행 :: 두 번째 매개 변수로 use_current() 를 :

atask.then([this]() 
    { 
     xamlStoryboard->Stop(); // now ok! 
     xamlImage->Source = ref new BitmapImage(); // now ok! 
    }, task_continuation_context::use_current()); 
+0

어떤 예외가 있습니까? – animaonline

+0

질문이 업데이트되었습니다 - VS11 디버거가보고합니다 : Concurrency :: unobserved_task_exception – Telestes

+0

그다지 말하지 않았지만 내부 예외가 있습니까? – animaonline

답변

0

당신이 아닌 다른 스레드에서 UI 요소를 호출 UI/Dispatcher 스레드 control.Dispatcher.InvokeAsync()를 사용하여 UI 요소의 메서드를 호출하거나 그렇지 않으면 백그라운드 스레드에서 호출하지 않도록해야합니다.

+0

감사합니다. 발견 : Metro 스타일 앱용 C++에서의 비동기 작업 만들기 장 : 자세한 내용은 "실행 스레드 제어"를 참조하십시오. http://msdn.microsoft.com/en-us/library/hh750082(v=vs.110).aspx 하지만 더 이상은 예외적이지 않습니다. 왜 예외가 발생합니까? :: 연속 코드. task : : 다음 작업이 완료되고 UI/XAML 컨트롤에 대한 액세스 권한이있는 주 스레드에서 실행 된 콜백 코드라고 생각 했습니까? – Telestes

+0

Answered in MSDN : 'then'메서드에 두 번째 매개 변수로 task_continuation_context :: use_current()를 전달하면 Dispatcher를 사용할 필요없이 예상대로 콜백이 예약됩니다. 자세한 내용은 C++의 비동기 프로그래밍을 참조하십시오. http://msdn.microsoft.com/en-us/library/windows/apps/hh780559.aspx '스레드 컨텍스트 관리'에서 약 2/3의 방법. – Telestes

관련 문제