实现功能/块的超时

时间:2014-12-09 12:17:34

标签: c# timeout

我想做这样的伪代码:

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应用程序中使用超时)。

1 个答案:

答案 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()子句中中断操作(通过任何机制是适合您的情况......再次,没有实际的代码,就不可能确切地说出那将是什么。)