知道哪个CancellationToken在CreateLinkedTokenSource中无法评估奇怪的cancelRequestRequested行为

问题描述 投票:0回答:1

我有以下代码

Class Class1
{
    Class2 class2 = new Class2();
    CancellationToken first = new CancellationToken();
    CancellationToken second = new CancellationToken();
    CancellationTokenSource cts=
              CancellationTokenSource.CreateLinkedTokenSource(first, second))
    class2.OpenSocketAndRead(cts.Token);
}

Class Class2
{
   public void OpenSocketAndRead(CancellationToken ct)
   {
       try
       {
          await websocket.ReceiveAsync(new ArraySegment<byte>(buffer, receivedBytes, availableBytes), ct).ConfigureAwait(false);
       }
       catch (WebSocketException e)
       {
           ct.ThrowIfCancellationRequested();
           var message = this.ConstructErrorMessage("Error during read.", ct);
           throw new CustomException(message);
       }
   }

   private string ConstructErrorMessage(String m, CancellationToken ct)
   {
       StringBuffer sb = new StringBuffer();
       sb.append(m);
       if(ct.IsCancellationRequested)
       {
           sb.append("WHICH TOKEN FAILED");
       }
   } 
}    

我经历了这种怪异的行为,其中ct没有抛出,并且流程进入了ConstructErrorMessage,其中ct.IsCancellationRequested的计算结果为true。 Websocket错误代码为ConnectionClosedPrematurely。

我想知道哪个标记在ConstructErrorMessage内部失败,为什么ThrowIfCancellationRequested无法执行。

c# cancellation cancellationtokensource cancellation-token
1个回答
0
投票

我经历了这种怪异的行为,其中ct没有抛出,并且流程进入了ConstructErrorMessage,其中ct.IsCancellationRequested计算为true。

这完全有可能-这意味着在调用CancellationToken之后和调用ThrowIfCancellationRequested之前,IsCancellationRequested被取消了。

我想知道哪个令牌失败

由于链接的令牌,在一般情况下这是不可能的。但是,您的代码可以检查取消了哪些令牌,并且出于所有实际考虑,通常就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.