2015-01-19 3 views
-2

У меня есть сообщение формы, которое должно вызывать действие асинхронно.C# Вызов асинхронного действия

public async Task<ActionResult> SaveW2Document(Models.DocumentData documentData) 
{ 
    some code here 
    var ID = await Task.Run<int>(() => somObject.SaveDocument(uploadDocument)); 
    //Code that uses ID 
    if(ID == something){ 
     //Do something  
    } 
} 

Однако он вызывается синхронно и другие мои действия не выполняются, пока это действие не получает completed.Is это что-то еще, что мне нужно сделать?

+2

Как это называется синхронно? Что-то ждало * это? (Обратите внимание, что ожидаемый единственный асинхронный вызов, вызываемый в этом коде, ожидается, поэтому выполнение внутри этого метода прекратится до тех пор, пока эта операция не завершится. Какой смысл имеет смысл, учитывая, что следующая строка основывается на результате этого вызова .) – David

+0

Действие следует вызвать асинхронно. то есть пользовательский интерфейс должен быть бесплатным для других вещей, которые в настоящее время не происходят. – nnm

+0

Вы вызываете этот метод как 'await SaveW2Document()'? – dymanoid

ответ

2

У меня есть сообщение формы, которое должно вызывать действие асинхронно.

Я думаю, вы не понимаете, что означает «асинхронный» в этом контексте. Использование действий контроллера async (или обработчиков HTTP-запросов вообще) означает, что веб-сервер может вызывать операции асинхронно и не удерживать поток в состоянии ожидания во время выполнения операции. Это позволяет веб-серверу более эффективно обрабатывать более параллельные запросы.

Браузер, однако является ждет ответа. Асинхронный характер любой данной операции обычно не определяется самой операцией, а тем, что вызывает ее. (Например, обратите внимание, как в этой операции ожидается ожидание еще одной асинхронной операции. Если этот код не ожидал этого, поведение было бы совсем другим. Но вызываемый метод не изменился бы между этими двумя сценариями.)

Это имеет смысл. В конце концов, что будет делать браузер, если он не дожидается ответа с сервера? Показать пустую страницу?

Вы можете сделать асинхронные вызовы на веб-сервер из клиентского кода с помощью AJAX. Это позволит странице вызывать операцию на стороне сервера и прослушивать ответ без блокировки или изменения контекста самой страницы. Но если весь контекст страницы отправляется на сервер и ожидает загрузки новой страницы, ему необходимо, чтобы получил, что новая страница, прежде чем она сможет ее отобразить.

+0

Хорошо, дайте мне объяснить. Вызов ajax вызывает форму. Я добавляю документ и некоторую информацию, и эта форма отправляется с помощью @using (Html.BeginForm («SaveDocument», «Home», FormMethod.Post, new {enctype = «multipart/form-data», id = "uploadFile"})) {// Код формы} Затем он вызывает действие, которое я написал в своем вопросе. Этот процесс должен происходить в фоновом режиме. Я не забочусь о его ответе. Мне просто интересно, что происходит в действии (запись в базе данных) . Я обрабатываю ответ при последующем посещении этой страницы. Я не могу использовать ajax, потому что вызов будет потерян при перезагрузке страницы. Вызов должен быть независимым от UI. – nnm

+0

@nnm: Операции «Я не забочусь о ее response "и' "Я не могу использовать AJAX", в этом случае взаимоисключающие. Без ответа *, что будет отображаться на странице *? Это было бы пусто. Когда вы выполняете запрос на уровне страницы для новой страницы (либо GET, либо POST), браузер * нуждается в *, чтобы дождаться ответа * до *, он может отображать то, что находится в этом ответе. Если вы хотите, чтобы действие было «огнем и забыто», вам нужно будет вызвать его в фоновом режиме. В веб-браузере это означает AJAX. – David

+0

форма исчезает после отправки. с сообщением в пользовательском интерфейсе «вернуться позже, чтобы просмотреть», поэтому нет пустой страницы. Другие ссылки видны и доступны. Что вы подразумеваете под вызовом в фоновом режиме? Это то, что я хочу выполнить с помощью действия Async. Итак, если я сделаю ajax для вызова этого действия вместо сообщения формы, это сработает? – nnm

0

Возможно, я, возможно, не смог задать вопрос правильно. Но я нашел решение проблемы, которая произошла. MVC имеет поведение, которое блокирует одновременные запросы, поступающие из того же сеанса. Мне нужно либо отключить сеанс, либо сделать его только для чтения для этого контроллера. См. Ссылку this.

Поэтому добавление [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] к моему контроллеру помогло.

+0

Лучшая практика заключается в том, чтобы SessionState устанавливался только для чтения, когда это возможно. Вы должны стараться изо всех сил писать только на сеанс входа/выхода пользователя, чтобы вы могли держать все остальные контроллеры в состоянии сеанса только для чтения. –

Смежные вопросы