2012-05-10 12 views
0

タスク(とタスク:: then)内のXAMLコントロールにアクセスしようとすると、Metro XAMLアプリは常に例外で停止します。同じコードは、タスクの外で問題なく動作します。私は何の答えも見つけられませんでした - 私は何を逃しましたか?タスク内のXAMLコントロールへの例外アクセス

VS11デバッガレポート:同時実行:: unobserved_task_exception

例外:アプリケーションが別のスレッドにマーシャリングされたインターフェイスと呼ばれます。

ご協力いただきありがとうございます。 2番目のパラメータとして

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追加する場合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 /ディスパッチャスレッド。あなたは、control.Dispatcher.InvokeAsync()を使用してUI要素のメソッドを呼び出す必要があります。そうでなければ、バックグラウンドスレッドから呼び出していないことを確認する必要があります。

+0

ありがとう、説明のために。 C++でのMetroスタイルのアプリケーションの非同期操作の作成 章:詳細については、「実行スレッドの制御」を参照してください。 http://msdn.microsoft.com/en-us/library/hh750082(v=vs.110).aspx さらに、私はタスクの中で例外を受ける理由を理解しないでください:: ::継続コード。私はtask ::と思ったのは、タスクが終了してUI/XAMLコントロールへのアクセス権を持つメインスレッドで実行された後にコールバックコードが実行されることです。 – Telestes

+0

でMSDN: 'then'メソッドに2番目のパラメータとしてtask_continuation_context :: use_current()を渡すと、コールバックはDispatcherを使用する必要なく予想どおりにスケジュールされます。 詳細については、「C++での非同期プログラミング」http://msdn.microsoft.com/en-us/library/windows/apps/hh780559.aspx「スレッドコンテキストの管理」の2/3の方法を参照してください。 – Telestes

関連する問題