簡體   English   中英

實現功能/塊的超時

[英]Implement timeout for function/block

我想做些偽代碼:

try for new Timespan(0,0,4) {
    // maximum execution time of this block: 4 seconds
    result = longRunningFunction(parameter);
    doSthWithResult(result);
    ...
} catch(TimeOutException) {
    Console.WriteLine("TimeOut occured");
}

這樣的構造在C#中是否可用,如果沒有,我將如何實現允許在一定時間內嘗試執行功能/塊的行為?

如果有幫助:我正在搜索ASP.NET WebAPI(盡管我也可以在WinForms應用程序中使用超時)。

如果希望longRunningFunction()本身停止,則需要在該方法中實現邏輯。 如何執行取決於您尚未提供的方法的確切實現,因此對於您當前的問題將無法回答。

但是,在許多情況下,僅放棄一個操作就足夠了,讓它自己運行完成,而忽略結果。 您可能會稱其為“繼續生活”。 :)

如果真是這樣,那么類似的事情應該為您工作:

Task<T> resultTask = Task.Run(() => longRunningFunction(parameter));

// maximum execution time of this block: 4 seconds
await Task.WhenAny(resultTask, Task.Delay(4000));

if (resultTask.IsCompleted)
{
    doSthWithResult(resultTask.Result);
}
else
{
    Console.WriteLine("TimeOut occurred");
}

longRunningFunction()的實際返回類型是任何值,將resultTask聲明中的T替換為。

請注意,上面的操作是機會主義的,即使長時間運行的操作花費了超過4秒的時間,並且Task.Delay(4000)贏得了比賽,只要它在您的代碼返回到if (resultTask.IsCompleted檢查,仍將視為成功。如果要嚴格if (resultTask.IsCompleted檢查,則即使Task.Delay(4000)首先完成, Task.Delay(4000)忽略結果,即使該操作在您實際檢查完成時已完成也是如此首先,您可以通過查看首先完成的任務來做到這一點:

Task winner = await Task.WhenAny(resultTask, Task.Delay(4000));

if (resultTask == winner)
{
    doSthWithResult(resultTask.Result);
}
else
...

最后:即使您確實需要longRunningFunction()停止,也可以使用上述技術,然后在報告超時的else子句中中斷操作(通過適合您情況的任何機制……再次,無需實際的代碼,無法確切地說出那是什么)。

暫無
暫無

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

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