【问题标题】:how to get access to the window in the wpf multi thread app如何访问 wpf 多线程应用程序中的窗口
【发布时间】:2010-02-18 16:30:13
【问题描述】:

我有一个单独的线程来监听数据。在接收到一些数据时,它需要访问应用程序中的一个窗口并为该窗口设置一些字段。

现在当我使用它时它会抛出一个异常(说这个线程无法访问,因为 Windows1 由其他线程拥有):

        foreach (Window w in App.Current.Windows)
        {
            if (w.Name == "WindowIamInterested")
            {
                //w.SetField set some fields in the window and 
                //and do w.Show() or w.Activate() to show the window to user
            }
        }

以上代码在单独的线程中运行,而不是在主线程中。 有没有办法可以访问和修改窗口。

【问题讨论】:

    标签: c# wpf multithreading window


    【解决方案1】:

    您在寻找窗口的dispatcher 吗?您可以从窗口中获取调度程序,并要求他通过Dispatcher.Invoke()Dispatcher.BeginInvoke() 执行您的代码...

    【讨论】:

      【解决方案2】:

      你可以使用Dispatcher.Invoke:

      Application.Current.Dispatcher.Invoke(
         (ThreadStart)delegate
         {
            // do your UI work here
         });
      

      Dispatcher.Invoke 同步执行。如果你想异步执行,可以使用Dispatcher.BeginInvoke

      【讨论】:

        【解决方案3】:

        如果您使用的是 WPF 控件,则可以使用它的调度程序在 UI 线程上安排更新:

        myControl.Dispatcher.BeginInvoke(
          System.Windows.Threading.DispatcherPriority.Normal
          , new System.Windows.Threading.DispatcherOperationCallback(delegate
          {                   
            // update control here
            return null;
          }), null);
        

        如果您需要阻止直到控件更新,您可以使用Invoke(),否则您应该使用BeginInvoke()

        【讨论】:

        • 但是我如何访问 myControl.这里 myControl 是一个窗口。那么如何访问该窗口。如果我尝试访问它会引发异常。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多