2011-06-29 3 views
2

基本的には、私のアプリケーションがハングしない非同期メソッドを呼び出すと、私は何かをクリックすることができます。非同期操作が完了すると、コールバックメソッドが実行されます。C#:Async Callback - コールバックメソッドの処理がアプリケーションをブロックしていますか?

これが再びブロックするのか、それともまだ「非同期的」なのかなと思いますか?つまり、コールバックメソッドが非常に集中していると、私のアプリケーションはうまく動いているのですか、コールバックメソッドが入力されるとブロックされますか?


更新:

私が話している何をあなたは場合、ブロッキングのいくつかの種類があります、あなたがサービス参照を追加するときに作成する方法であり、

public void AsyncSaveFooCompleted(Object sender, SaveFooEventArgs e) 
{ 
    //Send a large binary from the WCF Service 
    Client.SaveFooBinary(Foo.LargeBinary); 
} 

public void SaveFoo(Foo foo) 
{ 
    Client.SaveFooAsync(foo); 
} 
+1

実際に実行している非同期アクションの種類によって異なります。新しいスレッド()を使用していますか? –

+0

非常に曖昧な質問です。これは細部にぶら下がりますが、すべてが欠落しています。 –

+0

申し訳ありませんが、私が話していることを更新しました... – michael

答えて

3

を「非同期操作」を選択あなたのコールバックは集中的です。この問題が発生している場合は、asyncメソッドの処理をさらに進め、コールバックを素早くシンプルにしておきます。

また、これを段階的に処理する必要がある場合は、別のコールバックで別の非同期処理を開始するようにコールバックを設定してください。

1

私は、コールバックは、デフォルトではUIスレッドで実行されます

...あなたがC#5の非同期メソッドの話をしていると仮定しています。高価な作業を独自の作業(たとえばTaskEx.Run)に入れて、待ってください...重い処理がでないと仮定すると、UIスレッドで実行するのはになります。基本的に、UIスレッド上になければならない多くの作業があった場合、それについてできることはあまりありません。

+0

いいえ、申し訳ありません...私はそうではありませんでした。私は私の話を反映するために私の質問を更新しました。私は私のWCFサービスをSaveとSaveLargeBinaryに分割しました...そのように、固有の制約のために保存が失敗した場合、大きなバイナリをシリアル化する時間を無駄にしませんでした。私はむしろ正面から知り、SaveLargeBinaryをスキップします。 – michael

3

コールバックメソッドは集中的ではありません。私の意見では、あなたのスレッドは集中的な処理を処理し、コールバックにレンダリングロジックだけを任せるべきです。

0

非同期操作をどのように実行しているのか説明していないので、あなたの質問はあいまいです。 Jon SkeetのようなC#5.0の新しい非同期メソッドを使用している場合は、彼のアドバイスに従ってください。ただし、そうでなければ、(非同期で行っていますが)テストする最も簡単な方法は、コールバック。

Thread.Sleep(10000)の行に何かがあると、コールバックがUIスレッドをブロックするかどうかをすぐに知ることができます。あなたのUIスレッドは、そのタスクのいくつかの要件のために操作が完了するまでユーザーが何も続行できない限り、「集中的な」作業を行うべきではありません。ユーザーが待たなければならないので本当に重要ですいずれかの状況。しかし、UIスレッドで集中的に作業するUIは悪意のある「応答なし」を取得し、ユーザはまだタスクを実行していてもアプリケーションが動作を停止する可能性があるため、この悪い設計を検討することができます。

関連する問題