Доступ к объектам из классов


Доступ к объектам из классов
Atom
8/23/2013


Можно ли получить доступ из стратегии к внешним коллекциям. Вроде этого:

Code

    public partial class MainWindow : Window
    {
        public static ObservableCollection<MarketDepth> Stakan { get; set; }

        public MainWindow()
        {
            Stakan = new ObservableCollection<MarketDepth>() { };
            InitializeComponent();
        }
    }

    class MyStrategy:Strategy
    {
        protected override void OnStarted()
        {
            [h]Stakan.???[/h]
                
            base.OnStarted();
        }
    }



Thanks:


IvanB

Avatar
Date: 8/23/2013
Reply


Buratino Go to
Можно ли получить доступ из стратегии к внешним коллекциям. Вроде этого:


Можно, это можно сделать разными путями: передать коллекцию в конструктор стратегии, использовать статическое публичное поле коллекции, передать коллекцию в стратегию через специальное поле, быть может, можно как-то еще.
Пример использования статического поля:
Code

    public partial class MainWindow : Window
    {
        public static ObservableCollection<MarketDepth> Stakan { get; set; }

        public MainWindow()
        {
            Stakan = new ObservableCollection<MarketDepth>() { };
            InitializeComponent();
        }
    }

    class MyStrategy:Strategy
    {
        protected override void OnStarted()
        {
            //TODO: using MainWindow.Stakan
                
            base.OnStarted();
        }
    }
Thanks:

Buratino

Avatar
Date: 8/23/2013
Reply


А, да! Класс MainWindow не указал.

А как вернуть в поток стакан типа ObservableCollection<Quote> Stakan, через Dispatch.Invoke или GuiAsync...?

Code
        private void Process(MarketDepth md)
        {
            MainWindow.Stakan.AddRange(md);
            
        }


Такое исключение: Данный тип CollectionView не поддерживает изменения в своем SourceCollection из потока, отличного от потока Dispatcher.
Thanks:

Buratino

Avatar
Date: 8/24/2013
Reply


Вопрос ещё актуален. Не получается обновить из стратегии коллекцию привязанную к DataGrid. Исключение из-за ошибки в потоке.
Thanks:

IvanB

Avatar
Date: 8/25/2013
Reply


Buratino Go to
Вопрос ещё актуален. Не получается обновить из стратегии коллекцию привязанную к DataGrid. Исключение из-за ошибки в потоке.


Думаю, лучше в классе MainWindow сделать специальный метод, в который, в качестве аргумента подается стакан, и уже в этом методе, в потоке пользовательского интерфейса (через Dispatch.Invoke или GuiAsync) работаем с коллекцией.
Thanks:

Buratino

Avatar
Date: 8/25/2013
Reply


IvanB Go to

Думаю, лучше в классе MainWindow сделать специальный метод, в который, в качестве аргумента подается стакан, и уже в этом методе, в потоке пользовательского интерфейса (через Dispatch.Invoke или GuiAsync) работаем с коллекцией.


А так в принципе в C# устроено, что команда, запущенная из параллельного потока не может вернуть что-то в главный? Команда на возврат должна непременно вызываться из главного, Gui потока и возвращать в себя?
Thanks:

IvanB

Avatar
Date: 8/25/2013
Reply


Buratino Go to
IvanB Go to

Думаю, лучше в классе MainWindow сделать специальный метод, в который, в качестве аргумента подается стакан, и уже в этом методе, в потоке пользовательского интерфейса (через Dispatch.Invoke или GuiAsync) работаем с коллекцией.


А так в принципе в C# устроено, что команда, запущенная из параллельного потока не может вернуть что-то в главный? Команда на возврат должна непременно вызываться из главного, Gui потока и возвращать в себя?

Это связано с архитектурой пользовательского интерфейса.

Thanks:

Buratino

Avatar
Date: 8/27/2013
Reply


Это явление называется CallBack-ом, просьба параллельного потока вызвать себя из главного?
Thanks:

IvanB

Avatar
Date: 8/29/2013
Reply


Buratino Go to
Это явление называется CallBack-ом, просьба параллельного потока вызвать себя из главного?


Думаю, да, в данном случае можно назвать этот вызов CallBack'ом.
Вообще, CallBack'ом называют (обычно), когда передают делегат (указатель на метод), например, в другой метод.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy