【问题标题】:Modify control (call back) to UI Thread from static method从静态方法修改控件(回调)到 UI 线程
【发布时间】:2016-01-13 21:06:23
【问题描述】:

我刚刚修改了我的一个工具来启动一个新线程,而不是在静态类中运行静态方法。自然,我得到错误,因为这个新线程无法访问另一个线程。

但是,既然它们是分开的,我将如何调整下面的代码对 MainWindow/UI 线程执行相同的操作?

线程 t = new Thread(() => ParityHelper.MakeRequest(pack));

在静态类中,我现在像这样命令 UI 控件:

((MainWindow)System.Windows.Application.Current.MainWindow).ListOfTestsBox.Items.Add("COOL");

【问题讨论】:

  • 我发现了数千篇文章,但没有一篇文章涉及试图在 MainWindow 中引用控件的静态类。

标签: wpf multithreading controls


【解决方案1】:

如果您想与 UI 线程中的对象进行交互,您应该使用 Dispatcher (https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke(v=vs.110).aspx)。例如:

Thread t = new Thread(() => Dispatcher.Invoke(() => ParityHelper.MakeRequest(pack)));

【讨论】:

    【解决方案2】:

    // MainWindow.xaml.cs

    公共静态 MainWindow MainUI;

        public MainWindow()
        {
            InitializeComponent();
            MainUI = this;  // <---- IMPORTANT
        }
    

    //在另一个类中(在一个线程中运行)

        public delegate void DelTest();
    
        public static void Test()
        {
            Dispatcher.CurrentDispatcher.Invoke(
                DispatcherPriority.Normal,
                new DelTest(ParityChecker.MainWindow.MainUI.Tester)); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2010-12-16
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多