我有以下代码
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无法执行。
我经历了这种怪异的行为,其中ct没有抛出,并且流程进入了ConstructErrorMessage,其中ct.IsCancellationRequested计算为true。
这完全有可能-这意味着在调用CancellationToken
之后和调用ThrowIfCancellationRequested
之前,IsCancellationRequested
被取消了。
我想知道哪个令牌失败
由于链接的令牌,在一般情况下这是不可能的。但是,您的代码可以检查取消了哪些令牌,并且出于所有实际考虑,通常就足够了。