如何设置一行c#代码的超时

如何设置一行c#代码的超时,c#,timeout,C#,Timeout,可能重复: 如何在c#中设置代码行的超时。 例如 RunThisLine(一些方法(一些输入),TimeSpan.FromSeconds(10)) 运行SomeMethod,超时10秒。 提前感谢。我使用类似的方法(您应该添加代码来处理各种故障): var response=RunTaskWithTimeout( (Func)委托{返回SomeMethod(someInput);},30); /// ///如果任务失败,则在具有特定超时的后台线程上运行任务的通用方法, ///通知用户 ///

可能重复:

如何在c#中设置代码行的超时。 例如
RunThisLine(一些方法(一些输入),TimeSpan.FromSeconds(10))
运行
SomeMethod
,超时10秒。 提前感谢。

我使用类似的方法(您应该添加代码来处理各种故障):

var response=RunTaskWithTimeout(
(Func)委托{返回SomeMethod(someInput);},30);
/// 
///如果任务失败,则在具有特定超时的后台线程上运行任务的通用方法,
///通知用户
/// 
///函数的返回类型
///要执行的任务的函数委托
///任务超时前允许的时间
/// 
私有T RunTaskWithTimeout(Func TaskAction,int TimeoutSeconds)
{
任务背景任务;
尝试
{
backgroundTask=Task.Factory.StartNew(TaskAction);
backgroundTask.Wait(新的时间跨度(0,0,TimeoutSeconds));
}
捕获(聚合异常)
{
//任务失败
var failMessage=ex.flant().InnerException.Message);
返回默认值(T);
}
捕获(例外情况除外)
{
//任务失败
var failMessage=ex.消息;
返回默认值(T);
}
如果(!backgroundTask.IsCompleted)
{
//任务超时
返回默认值(T);
}
//任务成功了
返回背景任务。结果;
}
您可以使用。更确切地说,您可以使用:


您可以使用IAsyncResult和操作类/接口来实现这一点

public void TimeoutExample()
{
    IAsyncResult result;
    Action action = () =>
    {
        // Your code here
    };

    result = action.BeginInvoke(null, null);

    if (result.AsyncWaitHandle.WaitOne(10000))
         Console.WriteLine("Method successful.");
    else
         Console.WriteLine("Method timed out.");
}

代码的“行”是否协作,即它是否以某种方式支持取消?否,行处理必须限制在指定的时间内。请注意:这不会在超时后取消操作。我不是说它应该这样做——我之所以提到它,是因为我认为这是一个重要的细节。它很棒。
SomeMethod
的结果将在
task.result
变量中。谢谢。如果您只需要超时,并且/或者您的方法在取消时不处理令牌,则无需使用
CancellationToken
。Wait有一个没有
令牌的重载,工作正常。这是一个很好的解决方案,但不是停止功能。仅通知超时。即使SomeMethod在2秒内响应,代码段仍将等待10秒。@ValerianPereira:根据(请参阅备注),它不应该阻止,直到a)任务成功完成,b)任务抛出异常或c)任务超时。使用非常简单!!但这是否也会扼杀另一项任务?(超时情况下)其他任务=操作*
using System.Threading.Tasks;

var task = Task.Run(() => SomeMethod(input));
if (task.Wait(TimeSpan.FromSeconds(10)))
    return task.Result;
else
    throw new Exception("Timed out");
public void TimeoutExample()
{
    IAsyncResult result;
    Action action = () =>
    {
        // Your code here
    };

    result = action.BeginInvoke(null, null);

    if (result.AsyncWaitHandle.WaitOne(10000))
         Console.WriteLine("Method successful.");
    else
         Console.WriteLine("Method timed out.");
}