4

SynchronizationContext.Current.NET 4.0 のメイン スレッドで が予期せず nullになる問題の回避策は何ですか? 見る:

4

1 に答える 1

4

一致するいくつかの拡張メソッドを作成しContinueWithStartNew追加のSyncronizationContext. SynchronizationContext次に、この引数を使用して、アクションを実行する前に予想を復元します。

以下に例を示します。

public static class TaskExtensionMethods
{
    public static Task ContinueWith_UsingSyncContextWorkaround(this Task task, Action<Task> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler, SynchronizationContext sc)
    {
        Action<Task> actionWithWorkaround = t =>
        {
            SynchronizationContext.SetSynchronizationContext(sc);
            continuationAction(t);
        };

        return task.ContinueWith(actionWithWorkaround, cancellationToken, continuationOptions, scheduler);
    }

    public static Task StartNew_UsingSyncContextWorkaround(this TaskFactory taskFactory, Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler, SynchronizationContext sc)
    {
        Action actionWithWorkaround = () =>
        {
            SynchronizationContext.SetSynchronizationContext(sc);
            action();
        };

        return taskFactory.StartNew(actionWithWorkaround, cancellationToken, creationOptions, scheduler);
    }
}

次に、これらの拡張メソッドを.ContinueWithorの代わりに使用します.StartNew

関連する質問:

于 2014-01-06T15:29:44.423 に答える