Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从类外向主窗口调用dispatcher无效_C#_Wpf_Multithreading_Dispatcher - Fatal编程技术网

C# 从类外向主窗口调用dispatcher无效

C# 从类外向主窗口调用dispatcher无效,c#,wpf,multithreading,dispatcher,C#,Wpf,Multithreading,Dispatcher,当主窗口中包含doTest()时,如下所示,我的文本框正在从线程更新,我可以看到文本框值正在更改(因此从线程更新值是有效的) private void button1_Click(object sender, RoutedEventArgs e) { new Thread(delegate() { doTest(); }).Start(); } 现在,我的doTest()方法在clsTest.cs文件中有以下代码 internal static MainW

当主窗口中包含doTest()时,如下所示,我的文本框正在从线程更新,我可以看到文本框值正在更改(因此从线程更新值是有效的)

   private void button1_Click(object sender, RoutedEventArgs e)
    {
        new Thread(delegate() { doTest(); }).Start();
    }
现在,我的doTest()方法在clsTest.cs文件中有以下代码

internal static MainWindow tw;
内部类clsTest
{
公共clsTest(){}
公共空间doTest()
{
整数计数=20;
而(计数<30)
{
MainWindow.tw.Dispatcher.Invoke(
新操作(()=>MainWindow.tw.txtLog.Text=count.ToString()),DispatcherPriority.Background,null);
计数++;
睡眠(500);
}
}
}
请帮我找出我的错误所在

帮助我找出哪里出了问题


在这一部分中,你可以使用一个调度程序,而不仅仅是
文本

你发布的内容没有明显的问题。我觉得它们看起来不错,我通过在一个示例应用程序中运行你的代码片段进行了双重检查。我想这与你初始化静态“tw”的方式有关尚未显示的MainWindow实例

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

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

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

@panindra:“范围”是什么意思?每个需要一个调度程序的线程都有一个调度程序,如果在错误的调度程序上进行调度,则会出现异常。我刚才问,是否可以使用dispatcher方法调用ui控件(文本框)当线程在主窗口线程之外的单独类中运行时,我没有收到任何错误,但是我的文本框没有更新线程中的值。没有异常。当然可能,但我不建议这样做。线程可能只是默默地失败,你确定它能工作吗?如果不能,你可以尝试使用调试器单步执行它,or捕获可能的异常并将其写入控制台(输出窗口)。这是我在主窗口中对tw的定义—“内部静态主窗口tw=new mainwindow();”如果我将其声明为—“内部静态主窗口tw;”—我在运行时收到空异常。
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);
        }
    }
}
internal static MainWindow tw;

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