从外部类调用调度程序到主窗口不起作用

时间:2012-09-10 01:31:18

标签: c# wpf multithreading dispatcher

   private void button1_Click(object sender, RoutedEventArgs e)
    {
        new Thread(delegate() { doTest(); }).Start();
    }

当主窗口中包含doTest()时,如下所示,我的文本框正在从线程更新,我可以看到文本框值发生变化(因此线程中的更新值正在工作。

   public void doTest()
        {
            int count = 20;
            while (count < 30)
            {
                 Dispatcher.Invoke(new Action(() => txtBoxLog.Text = count.ToString()), null);
                count++;
                Thread.Sleep(500);
            }
        }

但是,如果我删除上面的代码并制作单独的类,放置在主窗口类之外,从线程更新我的文本框失败并且我没有得到任何错误但是根本没有改变它的值,我从线程更新使用调度程序不更新。

从doTest()类访问mainwindow我创建了内部静态主winodwo calss tw

internal static MainWindow tw;

现在我的doTest()方法在clsTest.cs文件中有以下代码

internal class clsTest
{
    public clsTest() { }

    public void doTest()
    {
        int count = 20;
        while (count < 30)
        {
            MainWindow.tw.Dispatcher.Invoke(
             new Action(() => MainWindow.tw.txtLog.Text = count.ToString()), DispatcherPriority.Background, null);

            count++;
            Thread.Sleep(500);
        }
    }
}
请帮助我确定我在哪里错了..

3 个答案:

答案 0 :(得分:1)

你发布的内容没有明显的错误。他们看起来很好,我通过在示例应用程序中运行您的代码片段进行了双重检查。我猜这与你如何初始化你未展示的静态“tw”MainWindow实例有关。

编辑:好的,你不应该像你正在做的那样明确地创建一个新的MainWindow实例,因为WPF会自动为你创建一个。相反,您应该将该静态实例设置为指向默认实例,例如在MainWindow类的构造函数中:

internal static MainWindow tw;

public MainWindow()
{
    InitializeComponent();
    tw = this;
}

答案 1 :(得分:0)

  

协助我找出我出错的地方

这是您使用调度员的部分,而不仅仅是Text的{​​{3}}。

答案 2 :(得分:0)

您是否需要将tw初始化为tw = this而不是tw = new MainWindow()