我有一个事件,该事件在调用时会导致死锁,并且需要测试以检查内部的死锁。但是我没有办法影响客户代码。
我一直尝试
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内部有一个等待状态-巫婆,当被要求停止并有一个请求时-陷入无限死锁状态-等待发送请求的时间,并且侦听器已由Stop关闭。 在我们的案例中,Wich是一种可能的情况。但是我似乎没有找到一种方法来调用该事件而又不会在测试中陷入僵局。
因此,非常感谢让Instance.ClientRequest等待几秒钟并抛出异常或被取消之类的正确方法-避免在实际发生死锁时挂起测试。
答案 0 :(得分:2)
如果您有Task
,并且知道它将在固定的时间内完成或出现死锁,则可以:-
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
}