gpt4 book ai didi

c# - 异步委托(delegate)与线程

转载 作者:太空狗 更新时间:2023-10-29 20:10:55 27 4
gpt4 key购买 nike

用异步委托(delegate)(回调)替换线程(不是 ThreadPool 线程)。

我的场景:为每个客户端生成一个 Thread/del.beginInvoke()。

在我看来,

原因

  1. 需要通过回调通知/在回调中再次调用委托(delegate)
  2. 避免线程开销,(委托(delegate)使用 Threadpool 线程)
  3. 传递参​​数(避免转换为对象)并需要方法的返回值。

如果以上原因有误,请指正。

  1. 还有其他原因吗?
  2. 在什么情况下我确实需要用异步委托(delegate)做一些事情线程不能?
    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.
}
}

从上面哪个选项是最好的。表现 ?

最佳答案

你的推理是正确的。异步委托(delegate)使用线程池中的线程,因此与手动创建线程相比,它们应该更快。但是在 ASP.NET 应用程序中要小心。因为您将耗尽通常由 ASP.NET 用于服务请求的工作线程,并且您的应用程序可能很快就会耗尽服务能力。

异步委托(delegate)非常适合 CPU 密集型任务。对于 I/O 密集型任务(例如读取流、数据库调用和 Web 服务调用),您应该使用相应类(Stream、SqlConnection、WebClient 等)直接提供的 BeginXXX、EndXXX 方法。这样,您在冗长的 I/O 操作期间根本不使用任何线程。您正在使用 I/O Completion Ports就 I/O 绑定(bind)任务而言,这是最好的事情。它将比任何线程和线程池的性能和资源便宜几个数量级。

总结一下:

  • 对于 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 做好准备。

关于c# - 异步委托(delegate)与线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11469370/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com