今日、SwitchTo メソッドを使用して GUI スレッドに切り替えようとしましたが、メソッドがそこにないという理由だけで、持ち上げた例が機能しないことがわかりました。
次に、この宣伝文句をここで見つけました:
私たちがそれを取り除いた理由は、それが非常に危険だったからです。別の方法は、TaskEx.Run... 内にコードをまとめることです。
私の質問は単純です:なぜ危険だったのですか? それを使用すると、具体的にどのような危険が生じるのでしょうか?
私はその投稿の残りの部分を読んだことに注意してください。したがって、ここに技術的な制限があることを理解しています. 私の質問は、私がこれを認識している場合、なぜ危険なのですか?
指定された機能を提供するためにヘルパー メソッドを再実装することを検討していますが、誰かが危険だと判断した以外に根本的に壊れているものがある場合は、実装しません。
具体的には、非常に単純ですが、必要なメソッドの実装を検討する方法は次のとおりです。
public static class ContextSwitcher
{
public static ThreadPoolContextSwitcher SwitchToThreadPool()
{
return new ThreadPoolContextSwitcher();
}
public static SynchronizationContextSwitcher SwitchTo(this SynchronizationContext synchronizationContext)
{
return new SynchronizationContextSwitcher(synchronizationContext);
}
}
public class SynchronizationContextSwitcher : INotifyCompletion
{
private readonly SynchronizationContext _SynchronizationContext;
public SynchronizationContextSwitcher(SynchronizationContext synchronizationContext)
{
_SynchronizationContext = synchronizationContext;
}
public SynchronizationContextSwitcher GetAwaiter()
{
return this;
}
public bool IsCompleted
{
get
{
return false;
}
}
public void OnCompleted(Action action)
{
_SynchronizationContext.Post(_ => action(), null);
}
public void GetResult()
{
}
}
public class ThreadPoolContextSwitcher : INotifyCompletion
{
public ThreadPoolContextSwitcher GetAwaiter()
{
return this;
}
public bool IsCompleted
{
get
{
return false;
}
}
public void OnCompleted(Action action)
{
ThreadPool.QueueUserWorkItem(_ => action(), null);
}
public void GetResult()
{
}
}
これにより、次のようなコードを書くことができます。
public async void Test()
{
await ContextSwitcher.SwitchToThreadPool(); // ensure we're not bogging down the UI thread
// do some heavy processing
await _UIContext.SwitchTo(); // presumably saved from the main thread
// update UI with new data
}