C# 如何正确取消任务。在内部死锁的情况下运行

C# 如何正确取消任务。在内部死锁的情况下运行,c#,lambda,delegates,.net-standard,C#,Lambda,Delegates,.net Standard,我有一个事件,调用时会导致死锁,需要测试来检查内部是否存在死锁。但是我没有办法影响客户代码 我试过几次,比如 Task t = Task.Run((Action)(() => { while(true); }), cts.Token); 以及在委托内插入令牌的方法,但由于在委托内调用了死锁,因此任何等待都不会发生 void Action() { var request = WebRequest.Create(url);(requestUrl); request.GetRe

我有一个事件,调用时会导致死锁,需要测试来检查内部是否存在死锁。但是我没有办法影响客户代码

我试过几次,比如

Task t = Task.Run((Action)(() => { while(true); }), cts.Token);
以及在委托内插入令牌的方法,但由于在委托内调用了死锁,因此任何等待都不会发生

void Action()
{
    var request = WebRequest.Create(url);(requestUrl);
    request.GetResponse();
    received = instance.RequestReceived;
}

instance.ClientRequeest += (object sender, EventArgs e) => instance.Stop();
我有一个EventHandler客户端请求可以订阅。 还有一个客户机实例,当我试图在它有一些数据要回复时停止它时,它会陷入死锁

ClientRequest内部有一个等待开关,当被要求停止并有一个请求时,它会进入无限死锁状态,它等待请求何时被发送,并且侦听器会被停止完全关闭。 在我们的案例中,这是一种可能的情况。但是我似乎找不到一种方法来调用该事件,而不在测试中使自己陷入僵局


因此,如果能找到一种合适的方法使该实例运行,我将非常感激。ClientRequest会等待几秒钟,然后抛出异常或被取消,或者诸如此类-以避免在实际发生死锁时挂起测试。

如果您有一个
任务,并且您知道它将在固定时间内完成,或者死锁,您可以:-

var t = Task.Run(() =>
{
    // do something that might deadlock, but if it doesn't will finish for sure in < 1000ms
});

if (!t.Wait(1000))
{
    // He's dead Jim
}
var t=Task.Run(()=>
{
//做一些可能会死锁的事情,但如果没有,肯定会在<1000毫秒内完成
});
如果(!t.Wait(1000))
{
//他死了,吉姆
}

如果客户端代码部分完成,是否中止或安全取消/回滚?(如果只中止一方,客户端代码甚至可能完全完成)。