2012-07-13 9 views
7

非同期代理人(コールバック)でスレッド(ThreadPoolスレッドではない)を置き換えます。非同期代行者対スレッド

私のシナリオ:クライアントごとにスレッド/ del.beginInvoke()を生成します。私によると

理由

  • 避けスレッドオーバーヘッド、(デリゲートがスレッドプールのスレッドを使用)
  • 渡す引数(避け
  • コールバックで再びコールバック/呼び出しデリゲート経由して通知の
    1. 必要オブジェクトにキャスト)、メソッドからの戻り値が必要です。

    上記の理由が間違っている場合は、私を修正してください。

    1. その他の理由はありますか?
    2. スレッドができない非同期委任でいくつかのことをする必要がありますか?
      3.性能?

    例がベストですどのオプション以上のことから

    public delegate void SendCallbackType(); 
    
        SendCallbackType senderdel= new SendCallbackType(SendData); 
    
        public void StartSend() // This method Could be Called more than 700 times (Thread per Client) 
        { 
         senderdel.BeginInvoke(SendCallback,null); 
            // (or) 
         Thread t = new Thread(new ThreadStart(ThreadSend)); 
         t.IsBackground = true; 
         t.Start(); 
        } 
    
        //Async Delegate 
        void SendData() 
        { 
         string data = QueData.DeQueue(); 
         RaiseOnData(data); // Raise to event. 
        } 
        void SendCallback(IAsyncResult ar) 
        { 
         senderdel.BeginInvoke(SendCallback, null); 
        } 
    
    //Thread 
        void ThreadSend() 
        { 
         while (true) 
         { 
         string data = QueData.DeQueue(); 
         RaiseOnData(data); // Raise to event. 
         } 
        } 
    

    。パフォーマンス?

    答えて

    10

    あなたの推論は正しいです。非同期デリゲートはスレッドプールからのスレッドを使用するため、手動スレッド作成と比較して高速にする必要があります。 ASP.NETアプリケーションではこれに注意してください。 ASP.NETで通常使用されるワーカースレッドを処理してリクエストを処理するため、アプリケーションで非常にすぐにサービス機能が使い果たされる可能性があるためです。

    CPU集約型タスクの場合、非同期のデリゲートは問題ありません。 I/O集約型タスク(ストリーム、データベース呼び出し、Webサービス呼び出しの読み込みなど)には、対応するクラス(Stream、SqlConnection、WebClientなど)によって直接提供されるBeginXXX、EndXXXメソッドを使用する必要があります。これにより、長いI/O操作中にスレッドをまったく使用しないようになります。あなたはI/O Completion Portsを使用していますが、これはI/Oバウンドタスクの点で最も優れています。どのスレッドやスレッドプールよりもパフォーマンスが高く、リソースも安いでしょう。だから、要約する

    • I/O集中型のタスクのためには、I/O完了ポートを使用します。 I/O集約タスクが、この可能性を提供していないライブラリの中にラップされている場合は、.NET 4.0で導入されたTPLを使用してください。
    • CPU集中型タスクでは、.NET 4.0で導入されたTPLを使用します。

    .NET 4.0ではスレッドプールを使用していない場合、ASP.NETアプリケーションを作成している場合を除き、手動スレッド作成に頼る場合があります。

    一般にTPLを使用し、メソッドをタスクとして使用して、async/awaitキーワードを導入する.NET 4.5の準備が整ったことを確認することをお勧めします。

    +0

    @ Darin:返信ありがとうございます。ここではWindowsのアプリケーションです、私は純粋にCPUの集中的なタスクと思います。性能については1000スレッド対1000のdel.begininvoke()を呼び出す –

    +0

    @MSKを呼び出し、間違いなくこの場合はTPLに行って、古いバージョンを使用しています。 NETは、スレッドプール(ThreadPool、BackgroundWorker、非同期デリゲート、... =>それらはすべてとにかくThreadPoolで終わる)を使用します。この状況では、スレッドを手動で生成しないでください。 –

    +0

    @ダーリン:そして、私は火を必要としないし、忘れます。ここでは、(ThreadPoolに関係なく)デキューするための専用のスレッドが必要ですし、同時にそれは長いプロセスを実行しています。 –

    関連する問題