DispatcherObject继承和使用......我没有得到什么?

时间:2011-07-28 18:42:29

标签: c# .net dispatcher

所以这是我的代码:

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(...)并在那里停止。

非常感谢任何有关调度员如何工作的见解。

感谢。

2 个答案:

答案 0 :(得分:1)

调度程序需要消息泵,控制台应用程序默认情况下没有消息泵。尝试将其作为GUI应用程序运行 - 这将有一个消息泵。

答案 1 :(得分:0)

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