【问题标题】:Exception accessing XAML controls inside a task访问任务内的 XAML 控件时出现异常
【发布时间】:2012-05-10 08:48:19
【问题描述】:

如果我尝试访问任务(和 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());

【问题讨论】:

  • 你遇到了什么异常?
  • 问题已更新 - VS11 调试器报告:Concurrency::unobserved_task_exception
  • 那不多说了,是不是有内部异常?
  • 尝试在 Dispatcher 线程上调用它,如果有的话。
  • 异常:应用程序调用了一个为不同线程编组的接口。

标签: xaml windows-runtime winrt-xaml c++-cx


【解决方案1】:

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

【讨论】:

  • 感谢您的解释。我发现:在 C++ 中为 Metro 风格的应用程序创建异步操作章节:“控制执行线程”以获取更多详细信息。 msdn.microsoft.com/en-us/library/hh750082(v=vs.110).aspx 但我进一步不明白,为什么我在 task::then 延续代码中出现异常。我认为 task::then 是在任务完成并在主线程中运行并访问 UI/XAML 控件后执行的回调代码?
  • 在 MSDN 中回答:如果您将 task_continuation_context::use_current() 作为第二个参数传递给 'then' 方法,那么您的回调将按预期安排,而无需使用 Dispatcher。有关详细信息,请参阅 C++ 中的异步编程msdn.microsoft.com/en-us/library/windows/apps/hh780559.aspx 大约是“管理线程上下文”中的 2/3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多