6

以下のスニペットを試しました:

    public Task RunUiTask(Action action)
    {
        var task = Task.Factory.StartNew(() =>
        {
            Dispatcher.Invoke(DispatcherPriority.Background, action);
        });
        return task;
    }

    private void OnCreateTask(object sender, RoutedEventArgs e)
    {
        var task = RunUiTask(() =>
            {
                for(int i=0;i<10;i++)
                {
                    ResultTextBlock.Text += i.ToString();
                }
            });
        task.Wait();                        //(a) Program stopped here
        ResultTextBlock.Text += "Finished"; //(b) Never called;
    }

OnCreateTask(ボタンクリックイベントハンドラー)が呼び出されたときに、プログラムが(a)で停止し、(b)が呼び出されない理由がわかりませんでした。

注:Dispatcher.BeginInvokeを使用してプログラムを応答可能にすることができることはわかっていますが、ここではこれは私の関心事ではありません。

プログラムが(a)で停止する理由と、(b)が呼び出されない理由を誰かが知ることができますか?ありがとう。

4

1 に答える 1

8

の呼び出し

Dispatcher.Invoke(DispatcherPriority.Background, action);

ActionUIスレッドで実行され、実行後に戻りActionます。問題は、のが原因でUI Theadがブロックされているtask.Wait()ためOnCreateTask、アクションが実行されず、デッドロックが発生することです。

編集

代わりにtask.Wait()、継続と更新を使用する必要がありますResultTextBlock.Text

task.ContinueWith(t=>{
     ResultTextBlock.Text += "Finished";
}, TaskScheduler.FromCurrentSynchronizationContext());
于 2013-03-19T13:14:07.407 に答える