C#异步取消,异常

C#异步取消,异常,c#,.net,asynchronous,.net-core,cancellation-token,C#,.net,Asynchronous,.net Core,Cancellation Token,所以-我写了一个服务器,它将监听一个端口-你可以等待它基本上无限期地挂起。它还需要一个取消令牌来杀死它。服务器和取消令牌都可以工作 所以-我有一些单元测试看起来像这样: var cancel=new CancellationTokenSource(); var server=CreateServer(cancel.Token); var check=await CallServer(); 断言相等(某物,检查); tokenSource.Cancel(); 等待服务器; ie——这个想法是启动

所以-我写了一个服务器,它将监听一个端口-你可以等待它基本上无限期地挂起。它还需要一个取消令牌来杀死它。服务器和取消令牌都可以工作

所以-我有一些单元测试看起来像这样:

var cancel=new CancellationTokenSource();
var server=CreateServer(cancel.Token);
var check=await CallServer();
断言相等(某物,检查);
tokenSource.Cancel();
等待服务器;
ie——这个想法是启动一个服务器,调用它——然后让它优雅地关闭,最后等待它关闭

所有这些都有效

当一切都好的时候。。。然而。。。如果我破坏了服务器中的某些内容(例如它抛出异常),异常就会消失,永远不会出现在任何地方,“wait server”命令将永远挂起(或者至少直到CI超时并终止进程)

如果我把
await server=createserver
放在一行上,异常就会正确地出现。现在,很明显,等待发生异常并被取消的东西是有问题的,但我无法理解


那么-我该如何解决这个问题?我应该怎么做,或者正确捕获异常,或者以更好的方式取消服务器,或者更好地重新构造此代码?

“异常会消失-永远不会出现-并且“等待服务器”命令永远挂起”-除非我误解了,否则听起来您好像处于死锁状态。可能是在链的更上一层,您只需调用
.Wait()
,而不是在链的上一层使用
等待任务<代码>等待
为您打开异常,这样它们就不会发出砰砰声。呼叫站点是什么样子的?它的声明中是否有
async void
?服务器变量的类型是什么?服务器是我的代码-它基本上只是var run=host.RunAsync(取消);如果(某物为假){};等待运行;其中主机是使用webhostbuilder构建的Kestrel web服务器_我当然从来没有调用wait,但我不知道runasync做什么。createServer函数只是async Task createServer()。这里真正的问题当然是-它在我的机器上工作得很好,但永远挂在ci机器上-因此我无法调试它:(