DispatcherObject的继承和使用…我没有得到什么

本文关键字:什么 继承 DispatcherObject | 更新日期: 2023-09-27 18:03:45

下面是我的代码:

class Program
{
  static DispatchClass dc;
  [STAThread]
  static void Main(string[] args)
  {
    dc = new DispatchClass();
    Thread th = new Thread(AccessDC);
    th.Start();
    Console.ReadKey();
  }
  private delegate void AccessDCDelegate(object state);
  static private void AccessDC(object state)
  {
    if(dc.Dispatcher.CheckAccess())
      dc.Print("hello");
    else
      dc.Dispatcher.Invoke(new AccessDCDelegate(AccessDC));
  }
}
public class DispatchClass : DispatcherObject
{
  public void Print(string str)
  {  
    Console.WriteLine(str);
  }
}

现在…我期望的输出是创建的线程检查分派器访问,看看它在不同的线程上,然后在原始线程上调用AccessDC(…),然后检查并看到它在正确的线程上并调用dc.Print(…)。

实际发生的是它到达CheckAccess()并正确地看到它不在正确的线程上,然后调用Invoke(…)并在那里停止。

如果您对Dispatchers的工作原理有任何了解,将不胜感激。

谢谢。

DispatcherObject的继承和使用…我没有得到什么

调度程序需要消息泵,控制台应用程序默认没有消息泵。试着把它作为一个GUI应用程序来运行——它将有一个消息泵。

CheckAccess验证你的CurrentThread DispatchClass是当前线程,所以它返回给你False。这很正常。在这段代码中

dc.Dispatcher.Invoke(new AccessDCDelegate(AccessDC));

你对争论有问题,仅此而已。

这段代码可以工作:

 public partial class MainWindow : Window
{
    static DispatchClass dc;
    public MainWindow()
    {
        InitializeComponent();

        dc = new DispatchClass();
        Thread th = new Thread(AccessDC);
        th.Start();
    }
    private delegate void AccessDCDelegate(object state);
    static private void AccessDC(object state)
    {
        if (dc.Dispatcher.CheckAccess())
            dc.Print("hello");
        else
            dc.Dispatcher.BeginInvoke(new Action(()=> AccessDC(null)));
    }
}
public class DispatchClass : DispatcherObject
{
    public void Print(string str)
    {
        MessageBox.Show(str);
    }
}