2013-08-23 2 views
0

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

public static void RunUpload() 
{ 
    Thread thread = new Thread(RunUploadOnThread); 
    thread.Start(); 

    while(thread.IsAlive) 
    {   
     Show("Rate upload in progress."); 
    } 

    Show("Rate upload completed."); 
} 

Show() просто положить сообщение на веб-странице:

public static void Show(string message) 
{ 
    string cleanMessage = message.Replace("'", "\'"); 
    Page page = HttpContext.Current.CurrentHandler as Page; 
    string script = string.Format("alert('{0}');", cleanMessage); 

    if (page != null && 
     !page.ClientScript.IsClientScriptBlockRegistered("alert")) 
    { 
     page.ClientScript.RegisterClientScriptBlock(
      page.GetType(), "alert", script, true /* addScriptTags */); 
    } 
} 
+0

какая ошибка/вы получаете? – Vandesh

+0

'thread.Join();' будет ждать окончания потока (но также блокирует ваш интерфейс) :). – I4V

+0

Я не получаю никаких ошибок, все, что я хочу, - это показать сообщения в режиме предупреждения. – user2123852

ответ

0

Вы начинаете нить, а затем просто строку ниже проверки, если он жив.

Как this property сообщает нам, если нить началась - это условие гонки в вашем коде. Когда-нибудь это может сработать, когда-то не зависящее, если планировщик потоков начал его быстро или нет.

Предлагаю отправить уведомление о том, что поток начался с самого рабочего потока.

Если вы используете .NET 4+, вы можете использовать что-то вроде параллельной библиотеки задач, что делает более приятным код.

Тогда вы можете получить уведомление, что оно завершено как продолжение. В противном случае отправьте уведомление как строку кода из рабочего потока.

2

Рассмотрите, что делает ваша страница. Когда запрос браузера приходит, он запускает новый поток и цикл до тех пор, пока он не завершится (но не надежно - ваше использование IsAlive имеет состояние гонки, как отмечал h. Alex). Когда цикл завершается, он отправляет данные в браузер, который может отображать окно предупреждения. Поэтому, даже если вы создали новый поток, вы не достигаете параллелизма. Фактически, поскольку ваш первый поток занят - ожидание на IsAlive, это на самом деле хуже, чем если бы вы только что сделали работу синхронно.

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

Наконец, вы обычно не хотите явно выделять новые потоки в ASP.Net. При загрузке вы получите лучшую общую производительность, если используете ThreadPool.

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