Вызов потока в C # .WPF - PullRequest
       25

Вызов потока в C # .WPF

4 голосов
/ 27 апреля 2011

есть. Я использую C # .wpf, и я получил этот код из источника C #, но я не могу его использовать. Что-нибудь, что я должен изменить? или делать?

 // Delegates to enable async calls for setting controls properties
    private delegate void SetTextCallback(System.Windows.Controls.TextBox control, string text);

    // Thread safe updating of control's text property
    private void SetText(System.Windows.Controls.TextBox control, string text)
    {
        if (control.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            Invoke(d, new object[] { control, text });
        }
        else
        {
            control.Text = text;
        }
    }

Как и в предыдущем коде, ошибка в InvokeRequired и Invoke

цель в том, что у меня есть текстовое поле с содержанием, которое будет увеличиваться для каждого процесса.

вот код для текстового поля. SetText(currentIterationBox.Text = iteration.ToString());

что-то не так с кодом?

спасибо за любую помощь

EDIT

// Delegates to enable async calls for setting controls properties
    private delegate void SetTextCallback(System.Windows.Controls.TextBox control, string text);

    // Thread safe updating of control's text property
    private void SetText(System.Windows.Controls.TextBox control, string text)
    {
        if (Dispatcher.CheckAccess())
        {
            control.Text = text;
        }
        else
        {
            SetTextCallback d = new SetTextCallback(SetText);
            Dispatcher.Invoke(d, new object[] { control, text });
        }
    }

Ответы [ 3 ]

9 голосов
/ 27 апреля 2011

Вы, вероятно, взяли этот код из Windows Forms, где у каждого элемента управления есть метод Invoke.В WPF вам нужно использовать объект Dispatcher, доступный через свойство Dispatcher:

 if (control.Dispatcher.CheckAccess())
 {
     control.Text = text;
 }
 else
 {
     SetTextCallback d = new SetTextCallback(SetText);
     control.Dispatcher.Invoke(d, new object[] { control, text });
 }

Кроме того, вы не звоните SetText правильно.Требуется два аргумента, которые в C # разделяются запятыми, а не знаком равенства:

SetText(currentIterationBox.Text, iteration.ToString());
6 голосов
/ 27 апреля 2011

В WPF вы не используете Control.Invoke, а Dispatcher.Invoke так:

Dispatcher.Invoke((Action)delegate(){
  // your code
});

Использование

Dispatcher.CheckAccess()

проверить первым.

3 голосов
/ 27 апреля 2011

В WPF используется следующая конструкция:

if (control.Dispatcher.CheckAccess())
{
   ...
}
else
{
   control.Dispatcher.Invoke(...)
}
...