2012-05-10 3 views
0

Если я попытаюсь получить доступ к элементам управления XAML внутри задачи (и задача :: then), мое приложение Metro XAML всегда останавливается с исключением. Тот же код работает без каких-либо проблем вне задачи. Я не нашел ответа - что я пропустил? Как сообщаетИсключение доступа к элементам управления XAML внутри задачи

VS11 Debugger: Параллельное :: 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

Вы вызываете свои элементы пользовательского интерфейса из потока, отличного поток пользовательского интерфейса/диспетчера. Вам нужно вызвать методы своих элементов пользовательского интерфейса, используя control.Dispatcher.InvokeAsync() или иным образом убедиться, что вы не вызываете их из фонового потока.

+0

Спасибо, для объяснения. Я нашел: Создание асинхронных операций в C++ для приложений Metro style Глава: «Управление потоком выполнения» для получения более подробной информации. http://msdn.microsoft.com/en-us/library/hh750082(v=vs.110).aspx Но я также не понимаю, почему я получаю исключения в задаче :: затем код продолжения. Я думал, что задача: тогда код обратного вызова выполняется после завершения задачи и запускается в основном потоке с доступом к элементам управления UI/XAML? – Telestes

+0

Ответил в MSDN: Если вы передадите task_continuation_context :: use_current() в качестве второго параметра методу 'then', тогда ваш обратный вызов будет запланирован, как ожидается, без использования диспетчера. Для получения дополнительной информации см. Асинхронное программирование на C++ http://msdn.microsoft.com/en-us/library/windows/apps/hh780559.aspx около 2/3 пути вниз в разделе «Управление контекстом потока». – Telestes

Смежные вопросы