2013-04-03 2 views
0

Учусь .NET и теперь я учусь веб Developement с ASP .NET MVC 4.C# Многопоточность ASP.NET MVC 4 - Эквивалент System.Windows.Threading.Dispatcher?

Я сделал задачу:

Task t = new Task(new Action(() => 
     { 
      while (convert("suitandtie.mp4") != 1) 
      { 
       if (i == 4) 
       { 
        // Here I want to access in mainthread property 
        // I need to change text for viewBag like : 
        // ViewBag.Message = "Convert failed"; 
        // But I need a Dispatcher and invoke for accessing 
        // the ViewBag of the mainthread 

        break; 
       } 
       i++; 
      } 
     })); 
     t.Start(); 

В .Net Заявке, с System.Windows.Threading.Dispatcher , его можно использовать для вызова вызова. я сделал это в моем приложении:

this.Dispatcher.Invoke(new Action(() => 
    { 
     ContactBook.Add(Person("Mark", "232 521 424")); 
    })); 

Когда я добавил Марк в записной книжке, он добавил в ContactBook в mainthread, не нити, созданной задачей.

Помогите пожалуйста получить доступ к ViewBag.Message mainthread?

+0

Учитывая безгражданство MVC, я даже не знаю, как вы хотите получить доступ к свойству 'ViewBag' после того, как действие завершилось, и представление было отображено. Вы либо должны заблокировать контроллер для обработки, а затем показать сообщение или сделать клиентский AJAX-вызов (неблокирующий). –

+0

Поскольку этот код предназначен для конвертирования видеофайлов, он может быть длинным. Я хочу загрузить новый вид. Я не хочу, чтобы пользователь подошел к концу процесса преобразования, потому что это одна минута ожидания. Я хотел бы преобразовать файл в поток, и если сбой преобразования после 4 попыток, я хочу сказать пользователю, что преобразование завершилось неудачей с свойством ViewBag.Message. Вы понимаете? Если я не делаю этого в потоке, представление блокируется из-за контроллера ... – manonthemoon

+1

И вы просто ** не можете ** получить доступ к ViewBag от контроллера * после того, как * визуализирован вид. Это было бы бессмысленно, представление было отображено и отправлено клиенту, соединение было закрыто, вот и все. Тот факт, что ваш рабочий поток все еще работает после того, как вы визуализировали представление, не делает его другим. Что вам нужно, здесь звонки AJAX ... –

ответ

0

Зачем вам нужно создавать это как отдельный поток?

Я спрашиваю, потому что, если клиент не выполняет вызовы aysn, нет никакой пользы в этом, если вы не будете делать много вещей одновременно и отложить выполнение контроллера до какой-либо другой службы ,

Самый простой способ, если вы хотите передать текущую тему в ViewBag.

+0

Поскольку этот код предназначен для конвертирования файлового видео, и он может быть длинным , Я хочу загрузить новое представление. Я не хочу, чтобы пользователь подошел к концу процесса преобразования, потому что это одна минута ожидания. Я хотел бы преобразовать файл в поток, и если преобразование завершится с ошибкой после 4 попыток, я хочу сказать пользователю, что преобразование завершилось неудачно с свойством ViewBag.Message. Вы понимаете? Если я не делаю этого в потоке, представление блокируется из-за контроллера ... – manonthemoon

+0

У вас может быть отдельный сервис, например, службы Windows, используемые вашим контроллером. Затем вам нужно, чтобы ваш клиент объединил другой ресурс REST, чтобы убедиться, что работа готова, но вы не можете сделать это так, как вы делаете. – Marco

0

Нет картографирования. Нет никакого средства взаимодействия с ответом, потому что ответ уже [потенциально] уже отправлен и соединение закрыто в этот момент времени.

Если вы запустите асинхронную операцию и не имеете что-то в контексте запроса, блокирующего эту операцию, то эта операция async не может вообще взаимодействовать с ответом.

Лучшее, что вы сможете сделать, это сохранить результаты всего, что вы создаете, в каком-то внешнем хранилище (например, в базе данных), чтобы будущий запрос с сервера мог получить информацию и отправить ее на клиент.

+0

Хорошо, я попытаюсь изучить ответ Эйлистри. Чтобы создать систему ajax с SignalR. Надеюсь, это не сложно – manonthemoon

+0

@manonthemoon Обратите внимание, что нет необходимости использовать AJAX. Это зависит от того, как вы хотите, чтобы пользователь закончил просмотр результатов операции. Если они должны быть уведомлены, как только закончится операция, вам понадобится AJAX, но если им не нужно ее видеть, пока они не загрузят новую страницу, вам это совсем не понадобится, вы можете просто написать операцию async данные в базу данных и новые запросы на страницу проверяют. – Servy

0

Viewbag (и любое состояние страницы) доступно только до того, как клиент отправил ответ. Это способ использования классической модели веб-сервера: клиент запрашивает URL-адрес, сервер отвечает на что-то (HTML, javascript, октет-поток ...). Если ваша операция длится несколько минут, вы должны рассмотреть возможность использования чего-то немного другого.

Personnaly, я бы загрузил начальную страницу классическим действием ASP.NET MVC, а затем запустил задачу длительной продолжительности с последующим запросом javascript.

Чтобы выполнить задачу, используйте что-то вроде SignalR, что позволит вам совершать двустороннюю связь между вашим клиентом и вашим сервером. С SignalR сервер сможет легко оповестить клиента в конце задачи. И это очень легко использовать в приложении ASP.NET MVC.

+0

Хорошо, я понимаю, что это система ajax. Теперь я попытаюсь изучить эту тему, SignalR. Надеюсь, это не сложно изучить. Спасибо за советы – manonthemoon

+0

Нет, это очень легко начать с SignalR :) – Eilistraee

+0

Просто для установки у меня проблемы с lol. Я делаю именно то, что говорит документация. Не знаю, почему установка не работает ... – manonthemoon