2011-01-27 4 views
3

私は、コードのこの作品に出会った、ThreadPool.SwitchToメソッドはどこにありますか?

を新しい非同期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方法は、私がAsyncCtpLibrary.dllにrefereceを持っているThreadPoolクラスに

ません...しかし、参考のために運

+0

私の拡張方法のようです。 –

+0

Visual Studioにコードがロードされていると仮定して、メソッドの名前を右クリックして「定義に移動」を選択します。そのメソッドが定義されている場所にすぐに連れて行くことができます。私はchibacityが 'ThreadPool'クラス以外の場所で定義されている拡張メソッドであると考えています。 –

+0

だからどこから?私はAsyncCtpLibrary.dllへの参照を追加しましたが、運はありません –

答えて

2

、CharlesOは、上記のコメントの中に彼の質問に答え:

OKを、それを見つけました。概要: ThreadPoolと対話するための方法を提供しています( )。備考:ThreadPoolExは のプレースホルダです。 System.Threading.ThreadPoolEx概要の System.Runtime.CompilerServices.YieldAwaitable メンバーとして

公共の共有機能SwitchTo(): を待つとき は非同期 のThreadPoolに得られることawaitableを作成します。

1

ThreadPool.SwitchToは、anit-patternなので、おそらく削除されました。元のコンテキストに戻す前に例外がスローされた場合に起こることを考えてください。ブロックfinallyをブロック対策として使用することはできません。awaitfinallyブロックには表示されません。

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

} 

もちろん、カスタムメジャーとアンウェイタータイプを開発して、削除されたものを正確に達成することができます。しかし、awaitを経由してコンテキストの中流を切り替えるよりも、Task.Run を使用する方がはるかに優れています。

関連する問題