2013-06-13 3 views
0

Метод MethodForThread() работает в другом потоке и в конце концов он должен перезвонить метод AsyncCallbackMethod() в потоке, в котором был вызван метод MethodForThread (). Я делаю это с классом Dispatcher. Но факт в том, что Dispatcher.Invoke() не называет этот метод AsyncCallbackMethod(). Что я делаю неправильно, что он не работает?Dispatcher.Invoke() не вызывает указанный делегат

using System; 
using System.Threading; 
using System.Windows.Threading; 

namespace EventsThroughDispatcher 
{ 
    class Program2 
    { 
     public delegate void AsyncCallback(); 

     static void Main(string[] args) 
     { 
      Thread.CurrentThread.Name = "MainThread"; 

      Thread thrdSending = new Thread(MethodForThread); 
      thrdSending.Name = "WorkingThread"; 
      ThreadParameters tp = new ThreadParameters(); 
      tp.DispatcherForParentThread = Dispatcher.CurrentDispatcher; 
      tp.SendingCompleteCallback = AsyncCallbackMethod; 
      Console.WriteLine("Start"); 
      thrdSending.Start(tp); 

      while (!Console.KeyAvailable) System.Threading.Thread.Sleep(100); 
     } 

     static private void AsyncCallbackMethod() 
     { 
      Console.WriteLine("Callback invoked from thread: " + Thread.CurrentThread.Name + " " + Thread.CurrentThread.ManagedThreadId); 
     } 

     static void MethodForThread(object threadParametersObj) 
     { 
      ThreadParameters tp = (ThreadParameters)threadParametersObj; 
      Thread.Sleep(1000); 
      tp.DispatcherForParentThread.Invoke(tp.SendingCompleteCallback, null); //this not working 
      //tp.DispatcherForParentThread.BeginInvoke(tp.SendingCompleteCallback, null); //and this not working too 
      Console.WriteLine("WorkingThread exited"); 
     } 

     private class ThreadParameters 
     { 
      public Dispatcher DispatcherForParentThread; 
      public AsyncCallback SendingCompleteCallback; 
     } 
    } 
} 
+0

Вы используете диспетчер WPF, но я ничего не вижу создания каких-либо элементов управления WPF и т.д. Вы уверены, что там даже есть * * диспетчеру ? –

+0

Я думал, что CurrentDispatcher создаст новый, если его нет, но может ли Диспетчер даже что-нибудь сделать во время Thread.Sleep? – Dirk

+0

Jon Skeet, то есть в консольном приложении Dispatcher не будет работать? –

ответ

2

Ваше решение не будет работать в этой форме. Объект Dispatcher можно использовать для внесения изменений в пользовательский интерфейс в двух словах (вы можете передать действие диспетчеру и передать его в управляемый сообщениями API WIN32, чтобы выполнить изменения в пользовательском интерфейсе).

Если вы отлаживаете свой код, вы можете видеть, что флаг Dispatcher.HasStarted является ложным, поэтому он ничего не передаст UIThread.

Я рекомендую использовать асинхронный проект.

Вы можете найти реализацию здесь:

http://www.codeproject.com/Articles/14898/Asynchronous-design-patterns

2

У вас есть одна проблема: категорический

while (!Console.KeyAvailable) System.Threading.Thread.Sleep(100); 

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

+0

Спасибо за ответ. Хорошо, я буду искать другой способ решить проблему ... –

Смежные вопросы