如何为 C# 函数设置超时?
How can I set a timeout into a c# function?
我最近在我的 c# 程序中创建了一个函数,它执行一些查询和其他东西,我想知道是否存在为该函数设置超时的方法:
特别是我希望我的程序能够在 10 分钟后函数未完全执行时停止。
我也想知道可不可以在函数内部自己实现这个控件,免得每次调用都要写。
最好的办法就是让方法取一个cancellationToken。它需要经常检查这个令牌并在它被取消时中止。通过创建一个 cancellationTokenSource: new CancellationTokenSource(timeout)
并将它拥有的令牌交给该函数,创建一个在超时后取消的令牌。对于长 运行ning 方法,最好采用取消令牌和某种方式报告进度。
如果没有办法修改函数,替代方案可能是这样的:
public async Task<(T Result, bool Completed)> RunTimeoutFunction<T>(Func<T> func, TimeSpan timeout)
{
var funcTask = Task.Run(func);
var timeoutTask = Task.Delay(timeout);
var completedTask = await Task.WhenAny(funcTask, timeoutTask);
if (completedTask == timeoutTask)
{
return (default, false);
}
return (funcTask.Result, true);
}
明显的缺点是即使在超时后,该功能仍将在后台继续 运行。然而,这是不可避免的,除非可以合作取消该功能。第三种选择是将函数放在一个单独的进程中,然后您可以在超时后安全地终止进程。
我最近在我的 c# 程序中创建了一个函数,它执行一些查询和其他东西,我想知道是否存在为该函数设置超时的方法: 特别是我希望我的程序能够在 10 分钟后函数未完全执行时停止。 我也想知道可不可以在函数内部自己实现这个控件,免得每次调用都要写。
最好的办法就是让方法取一个cancellationToken。它需要经常检查这个令牌并在它被取消时中止。通过创建一个 cancellationTokenSource: new CancellationTokenSource(timeout)
并将它拥有的令牌交给该函数,创建一个在超时后取消的令牌。对于长 运行ning 方法,最好采用取消令牌和某种方式报告进度。
如果没有办法修改函数,替代方案可能是这样的:
public async Task<(T Result, bool Completed)> RunTimeoutFunction<T>(Func<T> func, TimeSpan timeout)
{
var funcTask = Task.Run(func);
var timeoutTask = Task.Delay(timeout);
var completedTask = await Task.WhenAny(funcTask, timeoutTask);
if (completedTask == timeoutTask)
{
return (default, false);
}
return (funcTask.Result, true);
}
明显的缺点是即使在超时后,该功能仍将在后台继续 运行。然而,这是不可避免的,除非可以合作取消该功能。第三种选择是将函数放在一个单独的进程中,然后您可以在超时后安全地终止进程。