none
Путаница с потоками RRS feed

  • Вопрос

  • Такая картина. После передачи данных клиенту вызывается обработчик сообщения, который находится в модуле / классе. Там оно обрабатывается и вызывается соответствующая процедура уже в нужном окне. Раньше обработчик находился в самом окне, было нормально. Использовал Dispatcher.Invoke(New Action(Sub()..... ))) но теперь в модуле пишет, что "Ссылка на член не являющийся общим, должна быть ссылка на обьект" Как это исправить?
    29 сентября 2011 г. 14:55

Ответы

  • Либо делайте вызов Dispatcher.Invoke, как прежде в окне формы, либо передавайте его в класс, который нуждается в вызове, либо передавайте ссылку на все окно и после используйте уже Dispatcher этого окна. Это нужно, т.к. Dispatcher это свойство окна, которое ссылается на объект Dispatcher, ассоциированный с этом окном. Ниже код на C#, показывающий как можно передать Dispatcher и осуществить вызов, сложностей возникнуть не должно:

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                Test t = new Test();
                t.Run(Dispatcher);
                t.Run(this);
            }
        }
    
        public class Test
        {
            public void Run(Dispatcher dispatcher)
            {
                dispatcher.Invoke(new Action(() => MessageBox.Show("hello")));
            }
    
            public  void Run(Window window)
            {
                window.Dispatcher.Invoke(new Action(() => MessageBox.Show("hello")));
            }
        }
    

     


    Для связи [mail]
    • Помечено в качестве ответа Siompc 29 сентября 2011 г. 19:17
    29 сентября 2011 г. 15:39

Все ответы

  • Должно быть просто, а уже битй час ничего не идет в голову
    29 сентября 2011 г. 14:56
  • Либо делайте вызов Dispatcher.Invoke, как прежде в окне формы, либо передавайте его в класс, который нуждается в вызове, либо передавайте ссылку на все окно и после используйте уже Dispatcher этого окна. Это нужно, т.к. Dispatcher это свойство окна, которое ссылается на объект Dispatcher, ассоциированный с этом окном. Ниже код на C#, показывающий как можно передать Dispatcher и осуществить вызов, сложностей возникнуть не должно:

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                Test t = new Test();
                t.Run(Dispatcher);
                t.Run(this);
            }
        }
    
        public class Test
        {
            public void Run(Dispatcher dispatcher)
            {
                dispatcher.Invoke(new Action(() => MessageBox.Show("hello")));
            }
    
            public  void Run(Window window)
            {
                window.Dispatcher.Invoke(new Action(() => MessageBox.Show("hello")));
            }
        }
    

     


    Для связи [mail]
    • Помечено в качестве ответа Siompc 29 сентября 2011 г. 19:17
    29 сентября 2011 г. 15:39
  • Спасибо Дмитрий! :) Не знал, что dispatcher можно передовать в другие классы.
    29 сентября 2011 г. 19:17