当所有源令牌都处于取消状态时,如何创建将处于取消状态的CancellationTokenSource

时间:2019-10-16 23:39:33

标签: c#

我的客户端(使用SignalR)连接到多台服务器,并且每个服务器都有一个CancellationTokenSource,在连接中断等情况下被取消

在某些功能中,我想等待(即trace = toList),但是如果所有连接令牌都处于已取消状态(即甚至没有一台已连接的服务器),我希望延迟退出。

如何实现? await Task.Delay(1000, token)提供了CancellationTokenSource,但是当任何个源令牌处于取消状态而不是 all 时,生成的令牌将处于取消状态。 >

1 个答案:

答案 0 :(得分:1)

我认为此解决方案可能有效-尽管通常不应该使用取消令牌。我尚未验证处理逻辑,因此您可能需要仔细检查。

var tokens = ...;
var all = new CancellationTokenSource();
void OnCancel()
{
    if (tokens.All(token => token.IsCancellationRequested))
        all.Cancel();
}

var registrations = new List<CancellationTokenRegistration>();
foreach (var token in tokens)
    registrations.Add(token.Register(OnCancel));

all.Register(() =>
{
    foreach (var registration in registrations)
        registration.Dispose();
});

// Use the token

哦,还有一件事-如果您在注册回调时所有令牌都已被取消,我不确定这将如何表现。