2
4

2 に答える 2

3

common などasync-awaitのカスタムで使用する場合、は暗黙的にキャプチャされます。その後、非同期メソッドが完了すると、継続 ( の後のすべてのコード) が を使用して同じ同期コンテキストにマーシャリングされます。awaiterTaskAwaiterSynchronizationContextawaitSynchronizationContext.Post

InvokeRequiredこれにより、UI スレッドで作業をメインプレートするために使用されるテクニックやその他のテクニックを使用する必要が完全になくなります。そのためには、メソッド呼び出しを最上位レベルのものまで追跡し、async-awaitおそらく使用するようにリファクタリングする必要があります。

ただし、特定の問題にそのまま対処するには、初期化WinFormSynchronizationContext時にキャプチャすることができます。Form

partial class SomeForm : Form
{
    private TaskScheduler _uiTaskScheduler;
    public SomeForm()
    {
        _uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
    }
}

そして後であなたがしたいときにそれを使用してくださいawait

if (InvokeRequired)
{
    Task uiTask = new Task(() => DoSomethingToUserInterface());
    uiTask.RunSynchronously(_uiTaskScheduler);
}
else
{
    // Do async work
}
于 2014-11-21T08:52:47.703 に答える