2012-10-09 39 views
1

我使用C#,.NET Framework 3.5的软件开发把延迟。我的应用程序一次通过TCP/IP连接到多个客户端,并从中收集一些数据。客户号码非常高(超过100)。在我的应用程序开发过程之前,我已经做了一些研究,并且看到我必须在性能和可管理性方面使用异步套接字实现。
使用异步套接字方法时

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

+0

可能大家知道所需的延迟的原因吗?这似乎有点奇怪,故意延迟 –

+0

@AlastairPitts我把延迟,因为客户端机器需要延迟一些操作后。他们不会在几秒钟内回复任何命令。 – Fer

+0

更好的选择是在客户端准备好后缓冲客户端数据并使用数据。一个asnyc tcp(或其他)客户端的方式。 – HuseyinUslu

回答

1

我会用一个定时器,而不是一个匿名方法,Thread.sleep代码是(在大多数情况下)邪恶......

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

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

timer.Dispose()线是非常重要的,还有就是你可以有多少未予处置计时器有一个限度。

+0

我怎么知道我可以拥有的不定期定时器的数量?这个数字是否与我的应用程序可以创建的线程数量相同?其实我想知道你的建议是否为等待操作创建了一个新的线程。如果是这样,与Thread.Sleep方法非常相似,我想它会非常地降低性能。 – Fer

+0

在我执行我认为这是约50-60定时器,可以在同一时间激活,所以你可能需要使用一些限制,如果你打算做一个100个请求测试。是的,每个匿名方法都会在它自己的线程上执行,但是线程的寿命很短,因为您所做的只是异步发送和Dispose。如果你在一个线程上放置一个Thread.Sleep(2000),你可以保证它至少能活2000毫秒,而在它的大部分生命周期内没有任何用处。 –

+0

好的我相信你的解决方案比Thread.Sleep更好。不过,我认为会有比线程或计时器等待更好的解决方案。我认为可能有一个SendAsync函数重载,它以某种方式接受延迟参数,并在内部发送数据之前等待延迟的时间。这会很有用。 – Fer