Почему мне не нужно вызывать для некоторых элементов формы поток без графического интерфейса? - PullRequest
1 голос
/ 03 ноября 2010

У меня есть BackgroundWorker, который вызывает функцию в потоке без GUI. Я заметил, что для некоторых элементов формы я могу выполнить обновление графического интерфейса без выполнения вызова. Другие по-прежнему будут приводить к ошибке времени выполнения, поскольку программа попыталась обновить графический интерфейс без поточной защиты.

Почему это?

Ответы [ 2 ]

5 голосов
/ 03 ноября 2010

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

Обновление: Предполагается, что здесь есть WinForms.Если вы думаете, что это слишком громоздко для вызова, используйте метод расширения:

public static class ControlExtensions
{
   public static void Do(this Control c, Action f)
   {
      if (c.InvokeRequired)
      {
         c.Invoke(f);
      }
      else
      {
         f();
      }
   }
}

Затем в DoWork в BackgroundWorker:

// Background work here
this.Do(() =>
{
   // This runs on UI thread
});

Я считаю, что это намного проще в использовании, чем BackgroundWorkersReportProgress.

2 голосов
/ 03 ноября 2010

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

...