私は次のようなことをしたい - 基本的に別のスレッドでコールバックを呼び出す非同期操作を呼び出していて、インラインで完了するのを待っていたい。私の心配は、スレッド間で共有される変数の変更(bar &イベント)は、たとえばレジスタに格納されているために同期されない可能性があるということです。メンバー変数であれば、それらを揮発性にすることはできますが、スタック上に作成されたローカル変数にはvolatileを使用できません。私はメンバ変数を使用することができますが、私はそのクリーナーはすべてのローカルを維持することでクラスを混乱させないと思います。(コールバッククロージャを使用して)スレッド間でローカル変数を共有するのは安全ですか?
Bar bar = null;
ManualResetEvent event = new ManualResetEvent(false);
foo.AsyncOperation(new Action(()=>{
// This delegate will be called in another thread
bar = ...
event.Set();
}));
event.WaitOne(timeout);
// use bar
注: 'AsyncOperation'と' WaitOne'の間に何かを行う場合を除き、あなたにも同期 –
この質問は関連して、それを実行する可能性がありますhttp://stackoverflow.com/questions/6581848/memory-barrier-ジェネレータ/ 6932271#6932271 –
@Marc - 良い点ですが、APIは本質的に非同期です。これは、ネットワーク経由でサーバーに送信されるメッセージに基づいています。 AsyncOperatonでは、メッセージが設定され、応答があるとコールバックに通知されます。ほとんどの場合、非同期で使用しますが、この特定のケースでは結果を待っています。返事が来ない場合は、WaitOneにタイムアウトを含めます。 – Shane