DispatcherObject наследование и использование ... что я не получаю? - PullRequest
0 голосов
/ 28 июля 2011

Итак, вот мой код:

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 ]

1 голос
/ 28 июля 2011

Диспетчеру требуется обработчик сообщений, консольные приложения по умолчанию не имеют обработчика сообщений. Вместо этого попробуйте запустить его как приложение с графическим интерфейсом - в нем будет насос сообщений.

0 голосов
/ 18 октября 2015

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