2012-05-10 62 views
0

如果我嘗試訪問任務內的XAML控件(和task :: then),我的Metro XAML應用程序總是停止並出現異常。相同的代碼在任務外沒有任何問題。我沒有找到任何答案 - 我錯過了什麼?異常訪問任務中的XAML控件

VS11調試器報告:併發:: unobserved_task_exception

例外:應用程序調用這是編組爲一個不同的線程的接口。

非常感謝您的幫助!

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()延續代碼運行無一例外如果我們增加task_continuation_context :: 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

謝謝,解釋。 我發現:在C++中爲Metro風格應用程序創建異步操作 章節:「控制執行線程」獲取更多詳細信息。 http://msdn.microsoft.com/en-us/library/hh750082(v=vs.110).aspx 但我進一步不unterstand,爲什麼我在任務::然後繼續代碼異常。我認爲task :: then是在任務完成並在主線程中訪問UI/XAML控件後執行的回調代碼? – Telestes

+0

在MSDN中回答: 如果您將task_continuation_context :: use_current()作爲第二個參數傳遞給'then'方法,那麼您的回調將按預期進行調度,無需使用Dispatcher。 欲瞭解更多信息,請參閱C++中的異步編程http://msdn.microsoft.com/en-us/library/windows/apps/hh780559.aspx約2/3下的'管理線程上下文'。 – Telestes