[英]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.