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


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

Код

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

Теги:


Спасибо:




8 Ответов
IvanB

Фотография
Дата: 23.08.2013
Ответить


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


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

    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();
        }
    }
Спасибо:

Buratino

Фотография
Курсы
Дата: 23.08.2013
Ответить


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

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

Код
        private void Process(MarketDepth md)
        {
            MainWindow.Stakan.AddRange(md);
            
        }


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

Buratino

Фотография
Курсы
Дата: 24.08.2013
Ответить


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

IvanB

Фотография
Дата: 25.08.2013
Ответить


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


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

Buratino

Фотография
Курсы
Дата: 25.08.2013
Ответить


IvanB Перейти

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


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

IvanB

Фотография
Дата: 25.08.2013
Ответить


Buratino Перейти
IvanB Перейти

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


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

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

Спасибо:

Buratino

Фотография
Курсы
Дата: 27.08.2013
Ответить


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

IvanB

Фотография
Дата: 29.08.2013
Ответить


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


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy