7

スレッド (ThreadPool スレッドではない) を非同期デリゲート (コールバック) に置き換える。

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

私によると、

理由

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

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

  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.
      }
   }

上記から、どのオプションが最適でしょうか。パフォーマンス ?

4

1 に答える 1

10

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

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

要約すると:

  • 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 に備えることができます。

于 2012-07-13T11:55:16.670 に答える