Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Обновление интерфейса из фонового потока


Автор: VoyagerEternal 9.11.2010, 15:15
Нужно на сильверлайте сделать фоновую задачу, которая при этом будет обновлять интерфейс.

делаю так:

Код

запускаю поток:
new Thread(() =>
{
     //выполняю фоновую задачу
       
     AutoResetEvent waitHandle = new AutoResetEvent(false);
     Action action = () =>
     {
          //обновляю контрол
          waitHandle.Set();
     };
     dispatcher.BeginInvoke(action); //запускаю action в главном потоке
     waitHandle.WaitOne(); //жду когда выполнится waitHandle.Set();

     //продолжаю выполнение фоновой задачи
}) { IsBackground = true }.Start();


проблема в том, что на строчке waitHandle.WaitOne(); программа виснет, метод action не выполняется

этот же пример, но в WinForms:
Код

private void button1_Click(object sender, EventArgs e)
{
    EventWaitHandle waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset);
    Action action = () =>
    {
        label1.Text = "OK";
        waitHandle.Set();
    };
    Dispatcher.CurrentDispatcher.BeginInvoke(action);
    waitHandle.WaitOne();
}


проблема та же, но в WinForms открыт метод Dispatcher.Invoke, и если вместо BeginInvoke поставить Invoke, то все отлично работает.

А в Silverlight метод Invoke закрыт, и при использовании BeginInvoke прога виснет. Чо делать? 
Как вообще можно на Silverlight сделать фоновую задачу, с обновлением интерфейса?
как сделать ProgressBar например?

Автор: KelTron 9.11.2010, 18:15
Смотри System.ComponentModel.BackgroundWorker

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)