3

私は新しい非同期CTPを研究していて、いくつかのサンプルコードを調べています。

私はこのコードに出くわしました:

public async void button1_Click(object sender, EventArgs e) 
{ 
string text = txtInput.Text; 

await ThreadPool.SwitchTo(); // jump to the ThreadPool 

string result = ComputeOutput(text); 
string finalResult = ProcessOutput(result); 

await txtOutput.Dispatcher.SwitchTo(); // jump to the TextBox’s thread 

txtOutput.Text = finalResult; 
}

ThreadPool.SwitchToはどこにありますか?SwithcToメソッドはThreadPoolクラスにありません

AsyncCtpLibrary.dllへの参照があります...しかし運がありません

4

2 に答える 2

2

参考までに、CharlesOは上記のコメント内で彼の質問に答えました。

OK、それを見つけました、要約:ThreadPoolと対話するためのメソッドを提供します。備考:ThreadPoolExはプレースホルダーです。

Public Shared Function SwitchTo()As System.Runtime.CompilerServices.YieldAwaitable System.Threading.ThreadPoolExのメンバー概要:待機時にThreadPoolに非同期的に譲る待機可能オブジェクトを作成します。

于 2011-03-18T02:45:42.610 に答える
1

ThreadPool.SwitchToおそらくアンチパターンであるために削除されました。元のコンテキストに戻る前に例外がスローされた場合にどうなるかを検討してください。finallyブロックに表示できないため、その例外を防ぎ、元に戻すための対策としてブロックを使用することはできawaitませんfinally

public async void button1_Click(object sender, EventArgs e) 
{ 
  await ThreadPool.SwitchTo();
  try
  {
    // Do something dangerous here.
  }
  finally
  {
    await button1.Dispatcher.SwitchTo(); // COMPILE ERROR!
  }

}

もちろん、削除されたものを正確に実現するために、カスタムの待機可能タイプと待機タイプを開発することができます。ただし、を介してコンテキストを途中で切り替えるよりも、Task.Run1を使用する方がはるかに優れていますawait

于 2011-12-14T17:51:37.483 に答える