Геннадий Ванин (Gennady Vanin)
|
Дата: 08.01.2013
|
|
|
|
Творог Подскажите как правильно прочитать данное выражение из примера: Trader.MarketDepthsChanged += depths => this.GuiAsync(() => OnMarketDepthsChanged(depths));
Установите себе триал ReSharper (JetBrains) и, тогда, Вам будет видно, что: - при наведении мышки на GuiAsync()выдаётся описание:
(extension) viod DispatcherObject.GuiAsync(Action action)
Что выражения:
Код
Trader.MarketDepthsChanged += depths => this.GuiAsync(() => OnMarketDepthsChanged(depths));//as extension meth
Код
Trader.MarketDepthsChanged += depths => XamlHelper.GuiAsync(this, () => OnMarketDepthsChanged(depths));//as static meth
Код
Trader.MarketDepthsChanged += depths => XamlHelper.GuiAsync(this, delegate {OnMarketDepthsChanged(depths) };);
Код
Trader.MarketDepthsChanged += depths => this.GuiAsync(delegate { OnMarketDepthsChanged(depths);} );//as anonymous meth
- и т.д., и т.п.
эквивалентныПронавигировав по "Go To Implementation" к GuiAsync(), что он определён в в Ecng.Xaml.XamlHelper, как : Код
public static void GuiAsync(this DispatcherObject obj, Action action)
{
if (obj == null)
throw new ArgumentNullException("obj");
XamlHelper.GuiAsync(obj.Dispatcher, action);
}
//==============================================
public static void GuiAsync(this Dispatcher dispatcher, Action action)
{
XamlHelper.GuiAsync(dispatcher, action, DispatcherPriority.Normal);
}
//==============================================
public static void GuiAsync(this Dispatcher dispatcher, Action action, DispatcherPriority priority)
{
if (dispatcher == null)
throw new ArgumentNullException("dispatcher");
if (action == null)
throw new ArgumentNullException("action");
if (dispatcher.CheckAccess())
action();
else
dispatcher.BeginInvoke((Delegate) action, priority, new object[0]);
}
|
|
Спасибо:
|
|
|
|
|
Творог
|
Дата: 09.01.2013
Спасибо за наводку, ReSharper поставил.
Но я не вижу где объявляется depths, что он содержит, что возвращает. Это делегат? Почему дважды повторяется оператор => ? Сначала отправляются пустые параметры () => OnMarketDepthsChanged(depths), а потом всё остальное? Какая цепочка выполнения?
|
|
Спасибо:
|
|
|
|
|
Den
|
Дата: 09.01.2013
Геннадий Ванин (Gennady Vanin) Пронавигировав по "Go To Implementation" к GuiAsync(), что он определён в в Ecng.Xaml.XamlHelper, как : Код
public static void GuiAsync(this DispatcherObject obj, Action action)
{
if (obj == null)
throw new ArgumentNullException("obj");
XamlHelper.GuiAsync(obj.Dispatcher, action);
}
А откуда у вас решарпер сорцы берет? У меня он только до декларации по "Go To Implementation" доходит... )))
|
|
Спасибо:
|
|
|
|
|
Геннадий Ванин (Gennady Vanin)
|
Дата: 09.01.2013
|
|
|
|
Творог Спасибо за наводку, ReSharper поставил.
Но я не вижу где объявляется depths, что он содержит, что возвращает. Это делегат? Почему дважды повторяется оператор => ? Сначала отправляются пустые параметры () => OnMarketDepthsChanged(depths), а потом всё остальное? Какая цепочка выполнения?
Я Вам удочку дал (ReSharper или R#), а Вы продолжаете требовать рыбу... Первое depth - согласно контекстной подсказке - (parameter) IEnumerable <MarketDepth> Объявляется он в Вашей строчке и определяется компилятором из контексту - по синтакису выражения и используемых в них типах В частности событием, которое, опять же можно посмотреть через R#, определяется в StockSharp.Algo.BaseTrader: Код
public virtual event Action<IEnumerable<MarketDepth>> MarketDepthsChanged
{
}
Посм., что такое Action, Event, Event Handler, delegate Можете ничего не писать дважды, написав, для прикола: Код
object depths2 = null;
Trader.MarketDepthsChanged += depths => OnMarketDepthsChanged(depths2);
private void OnMarketDepthsChanged(object whatEver)
{
throw new NotImplementedException();
}
и вообще не использовать лямбда-выражения! Возвращаясь к Вашему выражению, пишите в коде изначальное Код
Trader.MarketDepthsChanged += whatEver => this.GuiAsync(() => OnMarketDepthsChanged(whatEver));
//вставляете, используя ReSharper, реализацию OnMarketDepthsChanged()
private void OnMarketDepthsChanged(IEnumerable<MarketDepth> asfsdf)
{
throw new NotImplementedException();
}
Разворачиваете, используя ReSharper, рядом стоящие закомментированные строчки - эквивалентны: Trader.MarketDepthsChanged += whatEver => this.GuiAsync(() => OnMarketDepthsChanged(whatEver)); в Код
Trader.MarketDepthsChanged += OnTraderOnMarketDepthsChangedOrWhatEver;
private void OnTraderOnMarketDepthsChangedOrWhatEver(IEnumerable<MarketDepth> whatEver)
{
//расскомментировать любую строчку - они эквивалентны
//this.GuiAsync(() => OnMarketDepthsChanged(whatEver));
//XamlHelper.GuiAsync(this, () => OnMarketDepthsChanged(whatEver));
//XamlHelper.GuiAsync(this, delegate { OnMarketDepthsChanged(whatEver); });
}
Так понятнее?
|
|
Спасибо:
|
|
|
|
|
Геннадий Ванин (Gennady Vanin)
|
Дата: 09.01.2013
Den А откуда у вас решарпер сорцы берет? У меня он только до декларации по "Go To Implementation" доходит... ))) М.б., это и не ReSharper, давно пользуюсь, не помню, что откуда берётся... У меня ещё и .NET Reflector установлен Да там в сырцах смотреть особенно нечего - они в основном обфусцированы, за редким исключеним попадается что-то читабельное
|
|
|
|
|
Moadip
|
Дата: 10.01.2013
Den А откуда у вас решарпер сорцы берет? У меня он только до декларации по "Go To Implementation" доходит... ))) При первом переходе по Ctrl + LeftMouse появится окошко с предложением и предупреждением.[smile] Соглашаемся. #R скачает какую-то примочку с сайта. После этого будет декомпилить.
|
|
|
|
|
Den
|
Дата: 10.01.2013
Moadip При первом переходе по Ctrl + LeftMouse появится окошко с предложением и предупреждением.[smile] Соглашаемся. #R скачает какую-то примочку с сайта. После этого будет декомпилить.
Он может даже ничего и не качает, а просто предупреждает, что не обязывает нас пользоваться декомпиллятором, и это все на нашей ответственности... [smile] Все заработало, спасибо!
|
|
Спасибо:
|
|
|
|
|
Творог
|
Дата: 11.01.2013
А почему в разделе SS API нет подраздела с описанием класса XamlHelper? Ведь там же, наверное, должно быть подробное описание, что такое GuiAsync и что за конструкции, где дважды передаются параметры в обработчик знаком =>.
Я правильно понимаю, что GuiAsync() - это метод, куда в качестве аргумента передаётся поток, который должен идти в порядке очереди, а не параллельно?
|
|
Спасибо:
|
|
|
|
|
Moadip
|
Дата: 11.01.2013
Цитата:А почему в разделе SS API нет подраздела с описанием класса XamlHelper? Где то я подобный вопрос уже видел.[smile] Полный путь для XamlHelper - Ecng.Xaml.XamlHelper. Описание API есть только для основных библиотек- Stocksharp. Посмотрите сколько библиотек начинается с Ecng и сколько там классов. Конечно если бы кто то взялся чтобы сделать описание, было бы круто.
|
|
Спасибо:
|
|
|
|
|
VassilSanych
|
Дата: 11.01.2013
Творог Я правильно понимаю, что GuiAsync() - это метод, куда в качестве аргумента передаётся поток, который должен идти в порядке очереди, а не параллельно? GuiAsync() оборачивает Dispatcher.BeginInvoke(), добавляя всякие ненужные проверки :) А тот в свою очередь синхронизирует текущий поток с потоком отрисовки GUI, потому что в Windows издревле GUI программы может работать только в одном потоке.
|
|
Спасибо:
|
|
|
|