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))
{
//他死了,吉姆
}
如果客户端代码部分完成,是否中止或安全取消/回滚?(如果只中止一方,客户端代码甚至可能完全完成)。