0

如果我尝试访问任务(和 task::then)中的 XAML 控件,我的 Metro XAML 应用程序总是会因异常而停止。相同的代码在任务之外没有任何问题。我没有找到任何答案 - 我错过了什么?

VS11 调试器报告:Concurrency::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!
    });
}

如果我们添加 task_continuation_context::use_current() 作为第二个参数,atask.then() 延续代码将无异常运行:

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

1 回答 1

0

您正在从 UI/Dispatcher 线程以外的线程调用您的 UI 元素。您需要使用 control.Dispatcher.InvokeAsync() 调用 UI 元素的方法,否则请确保您没有从后台线程调用它们。

于 2012-05-10T16:27:35.297 回答