2016-08-15 3 views
0

Что такое самый простой способ обновить элемент HTML из другого потока?Обновить элемент html из потока

У меня есть страница Razor/HTML с кнопкой startJob, которая заставит ActionResult запустить длинный процесс в фоновом потоке, из которого я хочу, чтобы фоновый протектора обновил элемент Html текущего состояния. Как я могу это сделать?

public ActionResult StartJob(int[] instList) 
    { 

      permissionCheck = new Thread(CheckPermissions); 
      permissionCheck.Start(); 


     var jr = new JsonNetResult(); 
     jr.Formatting = Newtonsoft.Json.Formatting.Indented; 
     jr.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
     jr.Data = (inQueue <= 0?0:inQueue); 

     return jr; 
    } 


    public void CheckPermissions() 
    { 
     for (int i = 0; i <= 100; i++) 
     {     
      Thread.Sleep(100); 
      //update the html element id status message 

     } 
    } 
+0

Не используйте ' Thread.Sleep', не гарантируется ждать минимального времени, вы должны использовать 'таймер', также почему бы не использовать' async' задачи? –

+0

Если ответ уже отправлен клиенту, вы больше не можете его изменять. Похоже, вы ищете что-то вроде SignalR (веб-сокеты) или, по крайней мере, какое-то решение для опроса AJAX. Код на стороне сервера не может «изменить элемент HTML», который находится в браузере. – David

ответ

1

Использование async/await и tasks вместо другого потока:

public async ActionResult StartJob(int[] instList) 
{ 
    await CheckPermissions; 

    var jr = new JsonNetResult(); 
    jr.Formatting = Newtonsoft.Json.Formatting.Indented; 
    jr.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
    jr.Data = (inQueue <= 0?0:inQueue); 

    return jr; 
} 


public async Task CheckPermissions() 
{ 
    for (int i = 0; i <= 100; i++) 
    {     
     //Thread.Sleep(100); // Don't use this 
     //update the html element id status message 

    } 
} 
+0

Я думаю, что он пытается реализовать «обновить элемент сообщения о статусе элемента html», а не часть длинной задачи. То есть. динамически обновлять веб-страницу с указанием того, как будет выполняться долго работающая задача. –

+0

@GeorgeRichardson Я предполагал, что проблема могла быть просто от попытки обновления через другой поток, и в этом случае async wait может использоваться для возврата управления при необходимости. Но, глядя на другой ответ, я могу ошибаться все вместе! –

+0

Как я могу получить доступ к элементу html внутри функции async Task? –

2

Это не представляется возможным из коробки с только C#, но есть два способа, вы могли бы идти о реализации этого.

  1. Используйте javascript на странице, чтобы опросить ваш сервер для получения обновлений, возможно, через контроллер WebAPI.
  2. Используйте SignalR, чтобы обновить страницу динамически (также требует JavaScript работает на вашей странице)

К сожалению, динамическое обновление веб-страницы не представляется возможным без использования, по крайней мере некоторые Javascript

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