15

Control.BeginInvoke と Control.Invoke の呼び出しが呼び出された順序で実行されるかどうかを知る必要があります。

次のシナリオがあります。

  1. UI スレッドがブロックされている
  2. WCF スレッド呼び出し Control.BeginInvoke
  3. WCF スレッドは Control.Invoke を呼び出します (または、BeginInvoke を再度呼び出します)。
  4. UI スレッドのブロックが解除されました
  5. ??

ステップ 1-4 の実行順序は、示されている順序であることが保証されています (技術的には順序がそのようであるとは限りませんが、私が持っている質問は、順序が示されている場合にのみ関係があります)。

質問は、手順 2 の BeginInvoke 呼び出しの前に、手順 3 の Invoke/BeginInvoke 呼び出しが実行される可能性があるかどうかです。

また、UI スレッドのブロックについてコメントしないでください。

4

4 に答える 4

12

あなたの場合、ステップ 2 は常にステップ 3 の前に実行されます。UI スレッドの BeginInvoke は、キューに入れられた順序で実行されます。

実際、UI スレッドはメッセージ ポンプであり、メッセージ キューを 1 つ持ち、それを消費するスレッドは 1 つだけです。そのため、作業項目がキューに入れられた順序で実行されることが保証されます。

Delegate.BeginInvoke を使用すると、実行順序が順不同になる場合があります。

于 2009-12-10T13:31:18.730 に答える
3

BeginInvoke 呼び出しは、宛先スレッドのキューに入れられます (到着順にポストされるため)。

WCF スレッドでの同期呼び出し (手順 3) は、このスレッドから行われる非同期呼び出し (手順 2) の前に実行される場合があります。

于 2009-12-10T13:24:41.023 に答える
0

適切な回答を得るには十分な情報がありません。UI スレッドがブロックされているため、手順 2 と 3 は別のスレッドで実行する必要があります。この 2 つの間に同期がない場合、どのようにして順序を知ることができるでしょうか?

Thread 1        Thread 2                       Thread 3         Thread 4
Block UI        Calls BeginInvoke              
Unblock UI      Calls Invoke or BeginInvoke    BeginInvoke runs  BeginInvoke runs

多くの並列処理が行われていますが、あなたが説明したことから、「何でも」と言う以外に、どのような順序が発生する可能性があるかを知る方法はありません。UI スレッドがブロックされる前、または UI スレッドがブロック解除された後に、BeginInvoke の呼び出しが発生しないとは言えません。

于 2009-12-10T13:14:40.730 に答える
0

想定することはできませんが、上記の 2 つの呼び出しの間に実際になんらかの依存関係がある場合は、セマフォを待機させ、両方が完了したときにのみ依存コードを実行します。

2 つの呼び出しを同時に行っている理由がパフォーマンスではない場合は、最初の呼び出しのコールバックで 2 番目の呼び出しを実行するだけです (デバッグがはるかに簡単になります)。

于 2009-12-10T13:39:22.653 に答える