2012-05-11 2 views
3

У меня есть приложение, которое при первом запуске и каждые 7 дней выполняет обновление, загружающее некоторые файлы из Интернета.Показать сообщение в графическом интерфейсе, когда поток работает в C#

Это обновление может занять до 5 минут в зависимости от того, сколько файлов требуется для загрузки.

То, что я собираюсь сделать, это запустить обновление в отдельном потоке, чтобы остальная часть графического интерфейса была пригодна для использования во время обработки обновления.

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

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

+2

Используйте компонент ['BackgroundWorker'] (http://msdn.microsoft.com/en-us/library/system.comp onentmodel.backgroundworker.aspx). –

+0

Покажите нам код, чтобы мы могли его построить! В противном случае вы получите супер общие ответы;) – banging

ответ

6

Все, что вам нужно сделать, это обернуть свой код доступа к UI вызовом Dispatcher.Invoke из фоновой темы. Образец Dispatcher для использования может быть получен через свойство Dispatcher вашего UIElement.

Если предположить, что метод ниже определяется в определении класса вашего UI элемента:

private void ProcessItems(IList<Item> items) 
{ 
    Task.Factory.StartNew(() => 
    { 
     for (int i = 0; i < items.Count; ++i) 
     { 
      // Code here runs on background thread. 
      this.ProcessItem(items[i]); 

      this.Dispatcher.Invoke(DispatcherPriority.Normal,() => 
      { 
       // Code here runs on UI thread. 
       this.UpdateStatus("Completed " + (i + 1) + " of " + items.Count); 
      }); 
     } 
    }, 
     TaskCreationOptions.LongRunning); 
} 
+0

Да, GUI должен быть WPF в настоящее время. –

+0

@HenkHolterman: Или Silverlight :-p – Douglas

0

С помощью этого маленького человека:

internal static class ControlExtensions 
{ 
    internal static void Invoke(this Control control, Action action) 
    { 
     control.Invoke(action); 
    } 
} 

вы можете позвонить в вас код (в виде выигрыша мира, МОФ имеет собственное решение):

... form.Invoke(()=>form.SomeControl.SomeProperty=someValue); 
Смежные вопросы