2107 次
2 に答える
3
common などasync-await
のカスタムで使用する場合、は暗黙的にキャプチャされます。その後、非同期メソッドが完了すると、継続 ( の後のすべてのコード) が を使用して同じ同期コンテキストにマーシャリングされます。awaiter
TaskAwaiter
SynchronizationContext
await
SynchronizationContext.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 に答える