我想为我的AsyncController设置一个可配置的超时值。我知道我们可以用[AsyncTimeout(5000)]属性修饰一个方法,并且还可以将该值与const变量一起使用。我想使用一个静态变量,以便在编译后可以有一种更可配置的方式来设置超时。

读取此AsyncManager似乎有一个可以设置的属性,称为超时。

这是我尝试过的。

[HttpPost]
    public void DoWorkAsync(MyQuery query)
    {
        AsyncManager.Timeout = TestTimeout; //TestTimeout is a static int set to 120000
        AsyncManager.OutstandingOperations.Increment();
        (do work)...
    }


似乎未使用AsyncManager.Timeout值,而是在默认的45秒后抛出TimeoutException。

有没有办法在编译时设置此超时值?

最佳答案

您可以像这样创建从AsyncTimeoutAttribute派生的类

public class CustomAsyncTimeoutAttribute : AsyncTimeoutAttribute
{
    public CustomAsyncTimeoutAttribute() : base(Params.TimeOut)
    {}
}


其中Params.Timeout包含您的静态超时变量。

或者,您可以尝试以下操作(只需复制/粘贴基本的AsyncTimeout功能):

public class CustomAsyncTimeoutAttribute : AsyncTimeoutAttribute
{
    public CustomAsyncTimeoutAttribute() : base(0)
    {}

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext == null)
            throw new ArgumentNullException("filterContext");
        var managerContainer = filterContext.Controller as IAsyncManagerContainer;
        if (managerContainer == null)
            throw new InvalidOperationException("The operation has timed out.");
        managerContainer.AsyncManager.Timeout = //There you can get your timeout parameter from resourse (i.e. config file, database, etc);
        base.OnActionExecuting(filterContext);
    }
}


另外,您应该用async键盘标记动作方法,方法应该返回TaskTask<T>,并且方法的最后一个参数应该是CancellationToken,否则AsyncTimeout不起作用。

例如:

[CustomAsyncTimeoutAttribute]
public async Task PerformAction(/*Some parameters*/, CancellationToken token)

09-27 16:13