thread Invocation in C# .WPF

Reza picture Reza · Apr 27, 2011 · Viewed 9.7k times · Source

there. I'm using C# .wpf, and I get this some code from C# source, but I can't use it. is there anything that I must change? or do?

 // 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;
        }
    }

As above code, the error is in InvokeRequired and Invoke

the purpose is, I have a textbox which is content, will increment for each process.

here's the code for the textbox. SetText(currentIterationBox.Text = iteration.ToString());

is there anything wrong with the code?

thank you for any help

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 });
        }
    }

Answer

R. Martinho Fernandes picture R. Martinho Fernandes · Apr 27, 2011

You probably took that code from Windows Forms, where every Control has a Invoke method. In WPF you need to use the Dispatcher object, accessible through a Dispatcher property:

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

Additionally, you're not calling SetText correctly. It takes two arguments, which in C# are separated with commas, not with equal signs:

SetText(currentIterationBox.Text, iteration.ToString());