none
Событие выполняется в старом потоке RRS feed

  • Вопрос

  • Здравствуйте!

     

    Столкнулся с проблемой, если например работает два потока и со второго потока срабатывает событие, на которое подписался класс который выполнялся в первом потоке, то вызываемый метод выполняется во втором потоке, а не в первом, а как сделать чтобы был в первом?

    Код для примера:

     

     

    class Program
     {
      static void Main(string[] args)
      {
       //Назовем текущий поток "Первый поток"
       Thread.CurrentThread.Name = "Первый поток";
       
       //Подпишемся на событие из класса NewClass
       NewClass.TestEvent += new NewClass.TestDelegate(Test);
    
       //Запускаем дополнительный поток
       Thread newThread = new Thread(new ThreadStart(NewClass.TestMethod));
       //Назовем дополнительный поток "Второй поток"
       newThread.Name = "Второй поток";
       newThread.Start();
      }
    
      static void Test()
      {
       //Выведем в консоль имя потока который сейчас выполняет этот метод
       Console.WriteLine(Thread.CurrentThread.Name);
       //Вылазит "Второй поток", а как сделать так, чтобы этот метод выполнялся в Первом потоке?
      }
     }
    
     class NewClass
     {
      public delegate void TestDelegate();
      public static event TestDelegate TestEvent;
    
      public static void TestMethod()
      {
       // Вызываем событие на которое подписался класс Programm в старом потоке
       TestEvent();
      }
     }
    

    Спасибо!

     


    30 июня 2011 г. 20:57

Ответы

  • Здравствуйте.

    Класс не "выполняется" в каком-либо потоке. Методы класса будут выполнятся в том потоке, из которого они вызываются. Если все же обязательно нужно вызвать метод в первом потоке - попробуйте покапать в сторону маршалинга потоков.


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 11 июля 2011 г. 9:26
    1 июля 2011 г. 10:49

Все ответы

  • Здравствуйте.

    Класс не "выполняется" в каком-либо потоке. Методы класса будут выполнятся в том потоке, из которого они вызываются. Если все же обязательно нужно вызвать метод в первом потоке - попробуйте покапать в сторону маршалинга потоков.


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 11 июля 2011 г. 9:26
    1 июля 2011 г. 10:49
  • Дмитрий спасибо за ответ!

     

    Спасибо, я это и имел ввиду) Не подскажите что-нибудь по маршалингу потоков?

    3 июля 2011 г. 11:57
  • К сожалению, тут я вам подсказать не смогу. Не сталкивался с этим ниразу, возможно вам стоит пересмотреть саму архитектуру приложения, чем возиться с маршалингом. Этот путь может быть быстрее, проще и на нем будет меньше ошибок.


    Для связи [mail]
    8 июля 2011 г. 11:47