2015-03-16 2 views
1

Я хотел бы установить настраиваемое значение таймаута для моего AsyncController. Я знаю, что мы можем украсить метод атрибутом [AsyncTimeout(5000)], и мы также можем использовать значение с переменной const. Я хотел бы использовать статическую переменную, чтобы у меня был более настраиваемый способ установки таймаута после компиляции.Как создать настраиваемый Asynctimeout

Чтение этого 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 не используется, а вместо бросать TimeoutException после дефолта 45 секунд.

Есть ли способ установить это значение таймаута во время компиляции?

ответ

2

Вы можете создать класс, производный от 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 keywork, ваш метод должен возвращать Task или Task<T>, а последний параметр ваш метод должен быть CancellationToken, иначе AsyncTimeout не работает.

Например:

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

Я попробовал первое предложение, и это, кажется, работает прекрасно. Благодаря! – Matthew