非同期代理人(コールバック)でスレッド(ThreadPoolスレッドではない)を置き換えます。非同期代行者対スレッド
私のシナリオ:クライアントごとにスレッド/ del.beginInvoke()を生成します。私によると
、
理由
- 必要オブジェクトにキャスト)、メソッドからの戻り値が必要です。
上記の理由が間違っている場合は、私を修正してください。
- その他の理由はありますか?
- スレッドができない非同期委任でいくつかのことをする必要がありますか?
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.
}
}
。パフォーマンス?
@ Darin:返信ありがとうございます。ここではWindowsのアプリケーションです、私は純粋にCPUの集中的なタスクと思います。性能については1000スレッド対1000のdel.begininvoke()を呼び出す –
@MSKを呼び出し、間違いなくこの場合はTPLに行って、古いバージョンを使用しています。 NETは、スレッドプール(ThreadPool、BackgroundWorker、非同期デリゲート、... =>それらはすべてとにかくThreadPoolで終わる)を使用します。この状況では、スレッドを手動で生成しないでください。 –
@ダーリン:そして、私は火を必要としないし、忘れます。ここでは、(ThreadPoolに関係なく)デキューするための専用のスレッドが必要ですし、同時にそれは長いプロセスを実行しています。 –