0

Task.ContinueWith()メインスレッドと終了後に同様に機能する拡張メソッドを作成する必要がありTask.ContinueWith()ます。

public static Task ContinueWithOnMainThread(this Task task, Action action) {
    return task.ContinueWith(t => action(), TaskScheduler.FromCurrentSynchronizationContext());
}

このメソッドは機能しますが、Task.ContinueWith() の前に実行されます

それが私がそれをテストした方法です:

public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();
        Loaded += delegate {
            LogThread("\nInMain ThredId: " + Thread.CurrentThread.ManagedThreadId);
            var task = new Task(InTask);
            task.ContinueWith(TaskContinue);
            task.ContinueWithOnMainThread(ReturnedToMainThread);
            task.Start();
        };
    }

    void InTask() {
        this.Dispatcher.Invoke(DispatcherPriority.DataBind, (Action<string>)LogThread, "\nInTask ThredId: " + Thread.CurrentThread.ManagedThreadId);
    }

    void TaskContinue(Task task) {
        this.Dispatcher.Invoke(DispatcherPriority.DataBind, (Action<string>)LogThread, "\nTaskContinue ThredId: " + Thread.CurrentThread.ManagedThreadId);
    }

    void ReturnedToMainThread() {
        LogThread("\nReturnedToMainThread ThredId: " + Thread.CurrentThread.ManagedThreadId);
    }

    void LogThread(string text) {
        TB.Text += text;
    }
}
4

1 に答える 1

3

だから問題はここにあります:

var task = new Task(InTask);
task.ContinueWith(TaskContinue);
task.ContinueWithOnMainThread(ReturnedToMainThread);

両方の継続を同じに追加していますtaskReturnedToMainThread後に実行したい場合TaskContinueは、継続実行TaskContinueを渡す必要がありますContinueWithOnMainThread。これは次のように行うことができます。

var task = new Task(InTask);
task.ContinueWith(TaskContinue)
.ContinueWithOnMainThread(ReturnedToMainThread);

ContinueWithOnMainThreadまた、常にメイン スレッドで継続が実行されるとは限らないことにも注意してください。継続が追加されたときにアクティブだったコンテキストから継続を実行します。メイン スレッドから継続を追加する場合 (実行されるタスクがメイン スレッドにない場合でも)、問題はありませんが、実際にバックグラウンド スレッド/コンテキストから継続をアタッチすると実行されます。そのバックグラウンド コンテキストで。

于 2013-04-30T14:03:50.333 に答える