【问题标题】:Putting a delay when using asynchronous socket methods使用异步套接字方法时延迟
【发布时间】:2012-10-09 05:43:58
【问题描述】:

我正在使用 C#、.Net Framework 3.5 进行软件开发。我的应用程序一次通过 TCP/IP 连接到多个客户端并从中收集一些数据。客户数量非常多(超过 100)。在我的应用程序开发过程之前,我做了一些研究,发现我必须使用异步套接字实现来实现性能和可管理性方面。

目前看来还可以,但我目前正在寻找在向客户发送数据之前延迟的最佳方法。我的应用程序有时需要等待大约 2 秒才能发送特定数据。现在,我只是在异步发送方法之前放了一个System.Threading.Thread.Sleep(2000); 代码行。这是方便的方法还是有更好的方法?这个Sleep函数会阻塞我的应用程序主线程还是只阻塞异步套接字所属的线程。

【问题讨论】:

  • 我们可以知道所需延迟的原因吗?故意拖延似乎有点奇怪
  • @AlastairPitts 我放了延迟,因为客户端机器在某些操作后需要延迟。它们在几秒钟内没有响应任何命令。
  • 更好的选择是在客户端缓冲数据并在客户端准备好后使用数据。一个 asnyc tcp(或其他)客户端方式。
  • @HuseyinUslu 感谢您的想法。但是缓冲与我的情况无关。我不需要缓冲任何东西,我只需要在通过 tcp 发送数据之前等待几秒钟。我寻找了一个内置的 .NET 解决方案,但恐怕我需要实现我自己的解决方案,这很可能是一个线程使用。

标签: c# sockets asynchronous tcp-ip


【解决方案1】:

我会使用带有匿名方法的计时器,Thread.Sleep(在大多数情况下)是邪恶的......

System.Threading.Timer timer;
timer = new Timer((cs) =>
    {
        ...asynchronous send here
        timer.Dispose();
    }, null, 2000, Timeout.Inifinite);

这意味着括号内的代码将在 2000 毫秒后运行一次。

timer.Dispose() 行非常重要,您可以拥有多少个未处理的计时器。

【讨论】:

  • 我怎么知道我可以拥有多少个未处理的定时器?这个数字与我的应用程序可以创建的线程数相同吗?其实我想知道你的建议是否为等待操作创建了一个新线程。如果是这样,与 Thread.Sleep 方法非常相似,我想它会大大降低性能。
  • 在我执行的测试中,我认为大约有 50-60 个计时器可以同时处于活动状态,因此如果要发出 100 个请求,您可能需要使用一些限制。是的,每个匿名方法都会在自己的线程上执行,但是线程的生命周期很短,因为你在它上面所做的只是异步发送和 Dispose。如果将 Thread.Sleep(2000) 放在线程上,则可以保证它至少可以存活 2000 毫秒,而在其生命周期的大部分时间里没有做任何有用的事情。
  • OK 我相信您的解决方案比 Thread.Sleep 更好。但是,我认为会有比线程或计时器等待更好的解决方案。我认为可能有一个 SendAsync 函数重载,它以某种方式接受延迟参数并在内部发送数据之前等待延迟时间。这会很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2021-02-14
  • 2018-06-13
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多