c# - 每秒执行 x 间隔时如何避免重叠?

标签 c# .net

我有一些代码每秒每 *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/

相关文章:

c# - 为什么要序列化整个 HttpResponseMessage?

c# - 从外部 LAN raspberry pi 3 windowsiot 连接到网络服务器

c# - 使用 LINQ 查询用户角色

c# - 获取 .net 应用程序的事件窗口

c++ - 通过 .net 互操作类调试 COM C++ 代码

c# - 为 RoleManager 和 UserManager 创建实例以进行单元测试?

c# - 使用 dotnet 驱动程序执行 mongo 聚合查询

c# - 在 Helper 类中的数据实体之间切换

c# - 为什么 Nullable<int> 不能编译而是 int?没有 'using System;'

c# - Html.AntiForgeryToken() 由于加密异常而失败