用异步委托(回调)替换线程(不是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线程vs 1000 del.begininvoke()调用 – 2012-07-13 12:04:30
@MSK时性能如何,在这种情况下肯定要和TPL一起使用,如果您使用的是旧版本的。 NET使用线程池(ThreadPool,BackgroundWorker,Async委托,... =>它们都将以ThreadPool结束)。在这种情况下不要手动产生线程。 – 2012-07-13 12:07:10
@达林:我不需要火,忘了。在这里我需要一个专门的线程去队列(不管ThreadPool),同时它是一个长时间运行的进程。 – 2012-07-13 12:36:52