我想做这样的伪代码:
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应用程序中使用超时)。
答案 0 :(得分:1)
如果您希望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");
}
将T
声明中的resultTask
替换为longRunningFunction()
的实际返回类型。
请注意,上述内容是机会主义的,因为即使长时间运行的操作时间超过4秒且Task.Delay(4000)
赢得比赛,只要它在您的代码返回{时完成{1}}检查,它仍将被视为成功。如果你想给它一个严格的截止,如果if (resultTask.IsCompleted
首先完成,即使操作在你实际检查首先完成的时间结束时忽略了结果,你可以通过查看首先完成的任务来做到这一点:
Task.Delay(4000)
最后:即使您确实需要Task winner = await Task.WhenAny(resultTask, Task.Delay(4000));
if (resultTask == winner)
{
doSthWithResult(resultTask.Result);
}
else
...
停止,您也可以使用上述技术,然后在您报告超时的longRunningFunction()
子句中中断操作(通过任何机制是适合您的情况......再次,没有实际的代码,就不可能确切地说出那将是什么。)