如何:错开SignalR客户端.c#中的[函数]调用

本文关键字:函数 调用 中的 错开 SignalR 客户端 如何 | 更新日期: 2023-09-27 18:13:25

我有一个像这样的基本函数:

public void AllDataUpdated()
{
    Clients.Others.allDataUpdated();
}

现在,我想在每个调用之间添加半秒的延迟。但是,我不想这样做只是锁定我的web服务器。

我的第一反应是:

async Task SendWithDelay(var other, var timeout)
{
    await Task.Delay(timeout);
    other.allDataUpdated();
}

和在我的public void AllDataUpdated()函数中相互迭代,并增加每次迭代的超时。这是正确的方法吗?我应该如何做到这一点,不会锁定我的web服务器与这个过程,但会交错信号发出?

谢谢!

EDIT:我希望的结果是client_0在0ms时获得此消息,然后client_1在500ms时获得此消息,等等。都来自同一个呼叫AllDataUpdated()

如何:错开SignalR客户端.c#中的[函数]调用

// synchronization primitive
private readonly object syncRoot = new object();
// the timer for 500 miliseconds delay
private Timer notificator;
// public function used for notification with delay
public void NotifyAllDataUpdatedWithDelay() {
    // first, we need claim lock, because of accessing from multiple threads
    lock(this.syncRoot) {
        if (null == notificator) {
            // notification timer is lazy-loaded
            notificator = new Timer(500);
            notificator.Elapse += notificator_Elapsed;
        }
        if (false == notificator.Enabled) {
            // timer is not enabled (=no notification is in delay)
            // enabling = starting the timer
            notificator.Enabled = true;
        }
    }
}
private void notificator_Elapsed(object sender, ElapsedEventArgs e) {
    // first, we need claim lock, because of accessing from multiple threads
    lock(this.syncRoot) {
        // stop the notificator
        notificator.Enabled = false;
    }
    // notify clients
    Clients.Others.allDataUpdated();
}