Диспетчер. Вызвать аналог для .net 2.0 - PullRequest
2 голосов
/ 02 декабря 2010

Я использую DataBindings в моем приложении .net, и есть места, где я обновляю некоторые значения пользовательского интерфейса из вторичных потоков.Итак, мне нужно вызвать основной поток пользовательского интерфейса для выполнения операций GUI без исключений.

в мире .net 3 Я мог бы сказать Dispatcher.CurrentDispatcher.Invoke(()=>{ /* update UI here */} );, но сейчас я работаю только с .net 2.0.

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

Ответы [ 5 ]

3 голосов
/ 08 мая 2012

Это все те же ответы. Возьмите ссылку на экземпляр для элемента управления пользовательского интерфейса (так как они всегда выполняются в основном потоке), проверьте, есть ли он там, и позвольте ему вызывать код, который вы хотите запустить в основном потоке. Глупо .NET 2.0, но работает. Если ваш код находится в форме, вы можете просто использовать:

BeginInvoke((ThreadStart)delegate{your.code.here();even.more.code.here();});
3 голосов
/ 02 декабря 2010

В .NET 2.0 и Windows Forms вам придется использовать BeginInvoke / EndInvoke методы элемента управления для обновления пользовательского интерфейса из фонового потока.

MSDN имеет следующий пример:

public delegate void InvokeDelegate();

private void Invoke_Click(object sender, EventArgs e)
{
   myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod));
}
public void InvokeMethod()
{
   myTextBox.Text = "Executed the given delegate";
}
2 голосов
/ 02 декабря 2010

возможно Application.OpenForms[0].Invoke?

0 голосов
/ 02 декабря 2010

когда мне это нужно, я всегда создаю метод, который начинается с

If (control.InvokeRequired)
{
    control.Invoke([This method], params);
    return;
}

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

0 голосов
/ 02 декабря 2010

Вы должны выбрать шаблон проектирования, который поможет вам сделать то же самое.

Класс, который имеет доступ к форме (или ее объекту), должен использоваться для делегирования действия в форму.Этот класс может использоваться потоками (убедитесь, что он все синхронизирован).

Редактировать:

Этот может вас также заинтересовать!

...