C#中的线程调用.WPF

4

您好。我正在使用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;
        }
    }

如上所述的代码,错误出现在InvokeRequiredInvoke中。

目的是,我有一个文本框,其中的内容将随着每个进程递增。

以下是文本框的代码。SetText(currentIterationBox.Text = iteration.ToString());

这段代码有什么问题吗?

感谢任何帮助。

编辑

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

那究竟是什么错误? - Ralph Shillington
你是否遇到了任何错误,还是只是假设你的代码有错误? - sikender
1
有什么建议吗?错误 2:“System.Windows.Controls.TextBox”不包含“InvokeRequired”的定义,且没有接受类型为“System.Windows.Controls.TextBox”的第一个参数的扩展方法“InvokeRequired”可以找到(是否缺少使用指令或程序集引用?) - Reza
3个回答

10

你可能从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());

当我像这样调用它时“SetText(currentIterationBox.Text = iteration.ToString());”,它仍然会出现错误。 - Reza
3
@Reza: "什么错误?" 你为什么认为他们会写错误描述?是因为有趣吗?你真的读过吗?我敢打赌它解释了出了什么问题。 - R. Martinho Fernandes
抱歉,这里出现了错误:“错误2:方法'SetText'没有接受1个参数的重载”。 - Reza

6
在WPF中,你不使用Control.Invoke,而是像这样使用Dispatcher.Invoke:
Dispatcher.Invoke((Action)delegate(){
  // your code
});

使用

Dispatcher.CheckAccess()

首先要进行检查。


我在上面编辑了我的代码,这样正确吗?因为当我像这样调用它时,仍然会出现错误:SetText(currentIterationBox.Text = iteration.ToString()); - Reza
SetText是一个带有两个参数的方法,一个是文本框,另一个是字符串。你应该这样调用它:SetText(currentIterationBox, iteration.ToString()); - Marino Šimić

3
在WPF中使用以下结构:
if (control.Dispatcher.CheckAccess())
{
   ...
}
else
{
   control.Dispatcher.Invoke(...)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接