簡體   English   中英

如何正確取消Task.Run與內部死鎖

[英]How to properly cancel Task.Run with deadlock inside

我有一個事件,當調用該事件會導致死鎖,並且需要測試以檢查內部的死鎖。 但是我沒有辦法影響客戶代碼。

我Allredy嘗試過一些類似的技巧

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並且有一個請求時-陷入無限死鎖狀態-等待發送請求時,Stop一直關閉偵聽器。 在我們的案例中,Wich是一種可能的情況。 但是我似乎沒有找到一種方法來調用該事件而又不會在測試中陷入僵局。

因此,對於使Instance.ClientRequest等待幾秒鍾並拋出異常或被取消等問題的正確方法非常感激-避免在實際發生死鎖時掛起測試。

如果您有一個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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM