2013-06-24 4 views
5

Есть ли способ вызвать метод асинхронного действия в стандартном методе действий и не дождаться выполнения метода async (сохраняя тот же объект запроса)?Запустить метод асинхронного действия в фоновом режиме

public class StandardController : Controller 
{ 
    public ActionResult Save() 
    { 
     // call Background.Save, do not wait for it and go to the next line 

     return View(); 
    } 
} 

public class BackgroundController : AsyncController 
{ 
    public void SaveAsync() 
    { 
     // background work 
    } 
} 

Я пытался использовать класс задач, чтобы сделать Backround работу, но когда я начал задачу и метод действия возвратил View, Запрос был убит, а мой экземпляр DependencyResolver был удален, так фоновая задача начала бросать исключения.

Первой идеей было выполнить Стандарт. Сохранять (без вызова фоновой задачи) и возвращать представление, в котором метод Background.Save можно было бы вызвать в ajax. Другими словами: вызовите другой запрос на контроллер асинхронного вызова, чтобы запустить фоновое задание.

Основная проблема заключается в том, как вызвать метод асинхронного хранения информации авторизации (в куки-файлах) и преобразователя зависимостей (в моем случае: autofac).

+0

Почему вы сначала вызываете методы контроллера? –

+0

Вы можете просто позвонить. 'SaveAsync()' вернет элемент управления 'Save()' в первый оператор 'await', если он должен ждать. Если вы хотите использовать фоновый поток, используйте 'Task.Run()' –

+0

Просто понял, что 'SaveAsync' не является асинхронным. Либо сделайте его асинхронным, либо вызовите его с помощью 'Task.Run()' –

ответ

-1

Для меня это работает прекрасно:

public class PartnerController : Controller 
    { 
    public ActionResult Registration() 
    { 
     var model = new PartnerAdditional(); 
     model.ValidFrom = DateTime.Today; 
     new Action<System.Web.HttpRequestBase>(MyAsync).BeginInvoke(this.HttpContext.Request, null, null); 
     return View(model); 
    } 

    private void MyAsync(System.Web.HttpRequestBase req) 
    { 
     System.Threading.Thread.Sleep(5000); 
     foreach (var item in req.Cookies) 
     { 
      System.Diagnostics.Debug.WriteLine(item); 
     } 
    } 
} 

На странице размещена назад и 10 секунд Обращаясь позже Асинхронный появляется в моей Debug Output. Не знаете, как это будет работать с информацией о файлах cookie/Authentication, но в сомнении вы можете передать значения методу.

Надеюсь, это поможет.

+0

Вы не получаете доступ к информации запроса из фоновой задачи; просто записывая на консоль отладки, поэтому он работает. Если фоновой задаче необходимо получить доступ к информации запроса (даже прочитать ее, считая, что она не отвечает на ответ), это не сработает. – Servy

+0

Конечно, я предполагаю, что он не хочет изменять запрос в методе Async.
«Если фоновая задача должна получить доступ к информации запроса (даже для чтения из нее, предполагая, что она не отвечает на ответ), это не сработает». Он также может передать httpContext.Request и прочитать его, он не будет распоряжаться. – Marguth

+0

Ему не нужно изменять его, но ему нужен доступ к нему. Чтобы процитировать вопрос, '' Основная проблема заключается в том, как вызвать метод асинхронизации, сохраняющий информацию авторизации (в куки-файлах) и преобразователь зависимостей (в моем случае: autofac). "Это не касается этого вообще. – Servy