Как написано в моем названии,
фон:
У меня есть 2 разных типа приложений (WPF-silverlight), которые могут общаться друг с другом - приложение «Доктор» и приложение «Пациент», но это не значит, что будут запущены только 2 приложения, например:
я могу запустить приложение 3 доктора и приложение 7 пациентов.
и все эти приложения общаются с помощью wcf через tcp соединение.
общение в режиме реального времени (например, приложение мессенджера)
поток
каждый раз, когда приложение онлайн (запускается), я регистрирую его соединение на wcf, потому что мне нужно сообщить другим приложениям (в режиме реального времени), что подключен новый клиент или отключен новый клиент.
Проблема:
нормально сообщить другому приложению, что есть входящее приложение / клиент,
но моя проблема в том, как сообщить другому приложению, если этот клиент был отключен,
нормально, если пользователь правильно закроет приложение (например, нажмите кнопку закрытия) - поэтому в wpf я могу вызвать wcf для отмены регистрации соединения,
но как, если соединение было прервано ненормально (например, напрямую отключите кабель питания вашего компьютера)
могу ли я узнать, что этот клиент все еще подключен или нет?
Я осознаю эту проблему, когда я нажимаю f5 в моем VS2008 и закрываюсь, и снова открываю и закрываю (повторяю), а затем, когда я отлаживаю, там сохраняется много соединений, но на самом деле клиент уже разрушен.
так кто-нибудь знает это лучшее решение?
пример высоко ценится
мой фрагмент кода:
Dictionary<Guid, Client> Connections = new Dictionary<Guid, Client>();
// above is the variable where i put the connections
object syncObj = new object();
public ITcpServiceCallback CurrentCallback { get { return OperationContext.Current.GetCallbackChannel<ITcpServiceCallback>(); } }
// this function is called when the program started
public List<Client> ShakeHand( Client client, RoleType appType ) {
if( GetClientsByCallback( CurrentCallback ).Count < 1 && GetClientsByID( client.ID ).Count < 1 ) {
List<Client> retVal = new List<Client>();
lock( syncObj ) {
if( appType == RoleType.Doctor ) {
List<Client> doctors = Helpers.GetDoctor( AppDomain.CurrentDomain.BaseDirectory + "App_Data/doctor.xml" );
foreach( Client doctor in doctors ) {
doctor.Status = ConnectionStatus.Offline;
foreach( Client con in Connections.Values ) {
if( con.Role == RoleType.Doctor && con.ID == doctor.ID ) {
doctor.Status = ConnectionStatus.Online;
break;
}
}
retVal.Add( doctor );
}
} else { //b la.. bla similiar like if above
}
client.Callback = CurrentCallback;
client.Status = ConnectionStatus.Online;
// this is the code where i add the connection
Connections.Add( Guid.NewGuid(), client );
}
return retVal;
}
return null;
}
Заранее спасибо