我有一个实时应用程序,可以跟踪全国各地多个站点的资产。作为这个解决方案的一部分,我有8个客户端应用程序更新一个中央服务器。
我的问题是有时应用程序会失去与中央服务器的连接,我想知道最好的处理方式是什么?我知道我可以增加最大发送/接收时间来处理超时,但我也希望有一个优雅的解决方案来处理如果与服务器的连接断开:
例如,我像这样调用我的服务:
我考虑添加一个try/catch,以便...
这种处理方式不能让我重新运行代码,因为会有大量的重复代码。有人有什么建议吗?
编辑:研究了Sixto Saez和user24601的答案后,有一个总体解决方案比在单个异常级别上处理超时更好,但是......我认为下面的方法可以解决我的问题(但这将增加大量额外的错误处理代码):
我的问题是有时应用程序会失去与中央服务器的连接,我想知道最好的处理方式是什么?我知道我可以增加最大发送/接收时间来处理超时,但我也希望有一个优雅的解决方案来处理如果与服务器的连接断开:
例如,我像这样调用我的服务:
using (var statusRepository = new StatusRepositoryClient.StatusRepositoryClient())
{
statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
}
我考虑添加一个try/catch,以便...
using (var statusRepository = new StatusRepositoryClient.StatusRepositoryClient())
{
try
{
statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
}
catch (TimeoutException timeout)
{
LogMessage(timeout);
}
catch (CommunicationException comm)
{
LogMessage(comm);
}
}
这种处理方式不能让我重新运行代码,因为会有大量的重复代码。有人有什么建议吗?
编辑:研究了Sixto Saez和user24601的答案后,有一个总体解决方案比在单个异常级别上处理超时更好,但是......我认为下面的方法可以解决我的问题(但这将增加大量额外的错误处理代码):
void Method(int statusId)
{
var statusRepository = new StatusRepositoryClient.StatusRepositoryClient()
try
{
IsServerUp();
statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
statusRepository.Close();
}
catch (Exception ex)
{
statusRepository.Abort();
if (ex is TimeoutException || ex is CommunicationException)
{
LogMessage(timeout);
Method(statusId);
}
else
{
throw new Exception(ex.Message + ex.InnerException);
}
}
}
}
bool IsServerUp()
{
var x = new Ping();
var reply = x.Send(IPAddress.Parse("127.0.0.1"));
if (reply == null)
{
IsServerUp();
}
else
{
if (reply.Status != IPStatus.Success)
{
IsServerUp();
}
}
return true;
}