Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当所有源令牌都处于取消状态时,如何创建将处于取消状态的CancellationTokenSource_C# - Fatal编程技术网

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

C# 当所有源令牌都处于取消状态时,如何创建将处于取消状态的CancellationTokenSource,c#,C#,我的客户端连接到多个服务器(使用SignalR),每个服务器都有一个CancellationTokenSource,当连接中断时会被取消,等等 在某些函数中,我希望等待(即wait Task.Delay(1000,token)),但如果所有连接令牌都处于已取消状态,即甚至没有一个连接的服务器,我希望延迟退出 如何做到这一点CancellationTokenSource提供了CreateLinkedTokenSource,但当任何源令牌处于取消状态时,生成的令牌将处于取消状态。并非所有的令牌都处于

我的客户端连接到多个服务器(使用SignalR),每个服务器都有一个CancellationTokenSource,当连接中断时会被取消,等等

在某些函数中,我希望等待(即
wait Task.Delay(1000,token)
),但如果所有连接令牌都处于已取消状态,即甚至没有一个连接的服务器,我希望延迟退出


如何做到这一点
CancellationTokenSource
提供了
CreateLinkedTokenSource
,但当任何源令牌处于取消状态时,生成的令牌将处于取消状态。并非所有的令牌都处于取消状态。我认为此解决方案可以工作,尽管取消令牌通常不是这样使用的。我还没有验证dispose逻辑,所以您可能需要再次检查

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

var令牌=。。。;
var all=新的CancellationTokenSource();
void OnCancel()
{
if(tokens.All(token=>token.IsCancellationRequested))
全部取消();
}
var注册=新列表();
foreach(令牌中的var令牌)
registrations.Add(token.Register(OnCancel));
全部。注册(()=>
{
foreach(注册中的var注册)
注册。处置();
});
//使用代币

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

您可以等待触发的任务吗?任务将在完成时完成,或者被取消令牌取消<代码>任务。Whalll(allTasks)我拥有的是在建立连接时创建的CancellationSource令牌,如果连接中断,我不确定您的建议,因为这里没有多个任务?考虑到可能实现您的确切规范的方法有很多,这个问题太广泛了。也就是说,规范本身是可疑的。您似乎误用了取消令牌。如果您使用TPL表示“连接”(网络连接?),那么更合适的对象是
Task
,而不是
CancellationToken
。尤其是对于网络代码,因为在TPL范例中,您有一个
任务
表示一个
异步
方法,该方法有一个从网络读取的循环,当该循环因任何原因终止时,该循环将完成。谢谢Peter,我必须考虑一下这个问题,我所拥有的是使用
HubConnectionBuilder
创建的信号器连接,在这里我可以添加一个
Closed
事件(在这里我取消一个令牌),可能有一种方法可以将所有这些都打包到一个任务中。。如果你要创建一个<代码>取消注册toksEngurCE <代码>,当每个连接都表示关闭时,请考虑使用<代码> TaskFuleTythOrthist。这是一种更好的表示方式,因为连接已完成而不是取消,这意味着您可以使用
Task.WhenAny
Task.whalll