2013-01-30 2 views
1

Я не могу заставить этот BackgroundWorker работать для меня. Я использую пример m3rLinEz «s из hereGUI зависает при использовании BackgroundWorker

Проблема заключается в том, что графический интерфейс не реагирует и процент не обновляется.

Я использую главную страницу, и я установил async="true" в заголовке страницы содержимого.
Я пропустил что-то еще?

ASPX Код:

<asp:Button ID="btnGo" runat="server" Text="Go" OnClick="btnClick_Go" />&nbsp; 
<asp:Label runat="server" id="textUpdate" text="0%" /> 

код за

protected void btnClick_Go(object sender, EventArgs e) 
{  
    BackgroundWorker bw = new BackgroundWorker(); 

    // this allows our worker to report progress during work 
    bw.WorkerReportsProgress = true; 

    // what to do in the background thread 
    bw.DoWork += new DoWorkEventHandler(
    delegate(object o, DoWorkEventArgs args) 
    { 
     BackgroundWorker b = o as BackgroundWorker; 

     // do some simple processing for 10 seconds 
     for (int i = 1; i <= 10; i++) 
     { 
      // report the progress in percent 
      b.ReportProgress(i * 10); 
      Thread.Sleep(1000); 
     } 

    }); 

    // what to do when progress changed (update the progress bar for example) 
    bw.ProgressChanged += new ProgressChangedEventHandler(
    delegate(object o, ProgressChangedEventArgs args) 
    { 
     textUpdate.Text = string.Format("{0}%", args.ProgressPercentage); 
    }); 

    // what to do when worker completes its task (notify the user) 
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
    delegate(object o, RunWorkerCompletedEventArgs args) 
    { 
     lblSuccess.Visible = true; 
    }); 

    bw.RunWorkerAsync(); 
} 

ответ

2

BackgroundWorker обычно используется с клиентской стороны UIs - WPF, WinForms и т.д.

В коде, вы» re пытается обновить UI после того, как ответ был отправлен обратно клиенту , Как вы ожидаете, что это будет работать без последующего запроса от клиента на сервер?

Когда речь идет о веб-приложениях, вам необходимо использовать AJAX для обновления интерфейса. Могут быть хорошие способы упростить управление AJAX, но вы не можете просто использовать BackgroundWorker на стороне сервера и надеяться, что все это сработает.

+0

Могу ли я запустить этот фоновый рабочий, обновить переменную сеанса, а затем обновить панель обновления, чтобы этот объект сеанса на сервере? Или я вообще не могу использовать фонового работника? – Niklas

+0

@ Никлас: Ну, вы теряете большую часть преимуществ, предоставляемых провайдерами «BackgroundWorker». Похоже, вы в основном хотите что-то положить в пул потоков. Лично я не уверен, что буду использовать сеанс как таковой - я бы создал идентификатор для «задачи, которую я начал», и периодически обновлял состояние этой задачи в чем-то постоянном (возможно, базе данных). –

+0

Хорошо, я начну смотреть на темы ... снова =) Спасибо! Это избавило вас от ненужных проб и ошибок. – Niklas

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