Введенеие Хочется сделать обертку для коннектора по типу урока 2. Часть 1. Создание обертки коннекторов (https://vk.com/stocksharpedu?z=video-66650972_167470507%2Feb956e23a603a4440c), чтобы было все по-взрослому)))
По простому(т.е. без использования класса SafeConnection и графического юзер контрола(wpfconnection)), подключение, c использованием библиотек 4.3.13, работает!
1. Анализ работы кода позволил найти проблему:
namespace TraderConnection
{
public class SafeConnection
{
private Timer timer_sc;
public Connector Trader
{
get; set;
}
public SafeConnection(Connector trader)
{
Trader = trader;
}
public void ConnectSafe()
{
Trader.ReConnectionSettings.Interval=TimeSpan.FromSeconds(10);
Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;
Trader.ConnectionError += OnNewException;
Trader.OrdersRegisterFailed += fails => fails.ForEach(f => OnNewException(f.Error));
Trader.Connect();
// !!!! В ЭТОМ МЕСТЕ Trader ИЗМЕНЯЕТ ЗНАЧЕНИЕ ПОЛЯ ConnectionState ИЗ Disconnected В Connecting....
// if (Trader!=null && Trader.ConnectionState==ConnectionStates.Connected)
// {
// try
// {
// IsConnected = true;
// }
// catch (Exception ex)
// {
// OnNewException(ex);
// }
// }
}
public void DisconnectSafe()
{
if (Trader != null && Trader.ConnectionState == ConnectionStates.Connected)
{Trader.Disconnect();}
}
public event Action<Exception> NewException = delegate { };
protected virtual void OnNewException(Exception exeption)
{
NewException(exeption);
}
public bool IsConnected
{
get
{return (Trader != null && Trader.ConnectionState == ConnectionStates.Connected);}
private set { }
}
}
}
2. Поскольку ConnectionState находится в состоянии Connecting, события Connected в классе WpfConnection не происходит:
namespace WpfConnectionInterface
{
/// <summary>
/// Interaction logic for InterFace.xaml
/// </summary>
public partial class InterFace : UserControl
{
private SafeConnection _safeConnection;
public SafeConnection SafeConnection {
set
{
_safeConnection = value;
btnConnect.IsEnabled = _safeConnection != null;
}
get { return _safeConnection; }
}
public InterFace()
{
InitializeComponent();
Loaded += InterfaceLoaded;
btnConnect.IsEnabled = false;
}
private void InterfaceLoaded(object sender, RoutedEventArgs e)
{
var window = Window.GetWindow(this.Parent);
if (window != null)
window.Closed += delegate
{
if (_safeConnection != null)
_safeConnection.DisconnectSafe();
};
}
private void ConnectClick(object sender, RoutedEventArgs e)
{
if (_safeConnection == null)
return;
if (_safeConnection.IsConnected)
{
//кнопка содержит контент "Disconnect", после щелчка по ней:...->
btnConnect.Content = "Connect";
btnConnect.IsEnabled = false;
_safeConnection.Trader.NewSecurities -= TraderNewSecurities;
_safeConnection.Trader.NewPortfolios -= TraderNewPortfolios;
_safeConnection.DisconnectSafe();
Action disconnected = null;
disconnected = () =>
{
_safeConnection.Trader.Disconnected -= disconnected;
this.GuiAsync(() => { btnConnect.IsEnabled = true; });
};
_safeConnection.Trader.Disconnected += disconnected;
}
else
{
//кнопка содержит контент "Connect", после щелчка по ней:...->
btnConnect.Content = "Disconnect";
btnConnect.IsEnabled = false;
_safeConnection.Trader.NewSecurities += TraderNewSecurities;
_safeConnection.Trader.NewPortfolios += TraderNewPortfolios;
Action connected = null;
connected = () =>
{
_safeConnection.Trader.Connected -= connected;
this.GuiAsync(() => { btnConnect.IsEnabled = true; });
};
//Здесь событием Connected соответственно и не пахнет
_safeConnection.Trader.Connected += connected;
_safeConnection.ConnectSafe();
}
}
public Security SelectedSecurity
{
get { return (Security) cbSecurities.SelectedItem; }
}
public Portfolio SelectedPortfolio
{
get { return (Portfolio)cbPortfolios.SelectedItem; }
}
private void TraderNewPortfolios(IEnumerable<Portfolio> obj)
{
this.GuiAsync(() => { cbPortfolios.ItemsSource = _safeConnection.Trader.Portfolios; });
}
private void TraderNewSecurities(IEnumerable<Security> obj)
{
this.GuiAsync(() => { cbSecurities.ItemsSource = _safeConnection.Trader.Securities; });
}
private void DisonnectClick(object sender, RoutedEventArgs e)
{
}
}
}
3. События NewSecurities и NewPortfolios не происходят. Поезда не едут)))
P.s. Предыдущее сообщение написано в состоянии аффекта от целого дня кодинга и дебагинга, сильно не судите)))