我有一些代码每秒每 *x*ms 写入一个套接字(例如每 100 毫秒写入一个套接字)并将响应输出到控制台。
问题是,当结果写入控制台时,有时会出现重复的计时,这意味着两个套接字发送是在完全相同的时间点上发送的。其代码如下所示。 (客户端和服务器之间的连接始终小于半毫秒)。
编辑:愚蠢地忘记提及这是多线程软件,有 4 个线程运行下面相同的逻辑。
// Edit: Eurgh I typed this out stupidly. These belong to the class not method.
var milliseconds = 100; // How long to sleep between each socket write.
var lastSendTime = 0;
//....setup socket etc....
while(true)
{
// Keep waiting until were ready..
while(((DateTime.UtcNow.Ticks / 10000) - (lastSendTime)) < milliseconds)
{
await Task.Delay(1); // Await so as not to affect performance
}
lastSendTime = DateTime.UtcNow.Ticks / 10000;
// .. socket send and receive..
Console.WriteLine("[" + DateTime.UtcNow.Ticks / 10000 + "]" + ":" + response);
}
当然,重复输出的示例如下(请注意前两行):
[63529897318427]:response
[63529897318427]:response
[63529897318527]:response
[63529897318627]:response
那么为什么有时会发生这种情况,我该如何预防呢?
最佳答案
您的代码就是所谓的 Critical Section 。您可以使用Mutex
来确保代码一次只执行一个。看看Mutex class
这是一个如何使用它的很好的例子: http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx#vcwlkthreadingtutorialexample4mutex
关于c# - 每秒执行 x 间隔时如何避免重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22272787/