web-dev-qa-db-ja.com

委任者と派遣者の違いは何ですか?

委任者と派遣者の違いは何ですか?

どちらの概念もよくわかりません。

7
texasbruce

委任は他のオブジェクトに責任を割り当てています。たとえば、会議に招待され、それを下級の同僚に割り当てる場合、私は委任しています。ここで注意すべき点は、会議に参加するのは後輩の同僚であり、彼と私の間に仲介者がいないということです。

派遣は委任されていません。ディスパッチャーは、リクエストを他の誰かに中継する仲介者のようなものです。たとえば、会議に出席するために、私の鋭い後輩がタクシー会社に集荷を依頼し、リクエストを受け取った人が近くのタクシー運転手にそれを派遣する場合があります。ここでの要点は、ディスパッチャーがリクエストを渡すだけであるということです。

14
theD

ディスパッチャー

  • ディスパッチャは、イベントが送信されるQueueと見なすことができます。
  • ディスパッチャーはIスレッドで実行され、UIのイベントを実行します。
  • ウィンドウでは、Iコントロールはそれらを作成したスレッドによってのみ変更できますなので、UIへの変更はすべてUIスレッドから行う必要があります。これが、ウィンドウを変更する操作が行われる重要な理由の1つです要素はUIのディスパッチャーに送信する必要があります。
  • ディスパッチャーでBeginInvokeを呼び出すバックグラウンドスレッドはディスパッチャーが処理を開始していなくても、すぐに戻ります。代わりにInvokeが使用された場合、バックグラウンドスレッドは、UIスレッドが処理を完了するまでブロックされます。 Silverlightでは、DispatcherにInvokeはなく、ほとんどの場合、UIスレッドが作業を処理している間、バックグラウンドスレッドがブロックされることは望ましくないことに注意してください。

デリゲート

  • デリゲートはCallbackおよびEvent Handlingに使用されます。
  • Delagateの辞書の意味は、「別の人のために行動する人」です。しかし、.netでは、それは本当に別のメソッドの代わりに機能するメソッドを意味します。
  • デリゲートは、スレッドプールでworker threadsを使用します。
  • UIスレッド(または実際には任意のスレッド)にいるときは、デリゲートでBeginInvokeおよびInvokeを呼び出すことができます。 BeginInvokeは、ワーカースレッドを使用して、上記と同じ方法でデリゲートを呼び出します。ただし、呼び出しは別のスレッドを使用しません。それは単に呼び出しスレッドのコンテキストでデリゲートsynchronouslyを呼び出し、完了時に戻ります。

このことを考慮: delegate.Invoke/BeginInvokeおよびthis.dispatcher.Invoke/BeginInvoke

  • BeginInvokeの意味:「これを実行して、完了する前に戻ります。戻り値を気にしないか、将来この時点でこのアドレスに電話をかけることができます。」
  • Invokeは、「これを実行します。ここに座って、完了するまで待ちます。」

要するに: The BeginInvoke is an asynchronous call. It executes a delegate asynchronously on the thread the Dispatcher is associated with.

7
Vaibhav Agarwal