use*_*898 7 c# exception-handling asyncsocket
我有一个3层架构并使用tcp套接字在传输层(TCP客户端)中发送一些数据这种方法是使用BeginSend方法异步的.
public void TransportData(Stream stream)
{
try
{
SetTransporterState(StateObject.State.SendingData);
if (clientSock.Connected)
{
ASCIIEncoding asen = new ASCIIEncoding();
stream.Position = 0;
byte[] ba = GetStreamAsByteArray(stream);
if (clientSock.Connected)
clientSock.BeginSend(ba, 0, ba.Length, SocketFlags.None, new AyncCallback(SendData), clientSock);
else
throw new SockCommunicationException("Socket communication failed");
}
catch (SocketException sex)
{
throw sex;
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
}
}
catch (SocketException soex)
{
throw soex;
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
catch (Exception ex)
{
LoggingMessageHelper.LogDeveloperMessage(ex.Message + Environment.NewLine + ex.StackTrace, 1, TraceEventType.Critical);
bool rethrow = ExceptionPolicy.HandleException(ex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
回调代码SendData()如下所示
private void SendData(IAsyncResult iar)
{
Socket remote = null;
try
{
remote = (Socket)iar.AsyncState;
try
{
int sent = remote.EndSend(iar);
}
catch (Exception ex)
{
throw ex;
}
if (remote.Connected )
{
remote.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), remote);
}
else
throw new SockCommunicationException("Communication Failed");
}
catch (SocketException soex)
{
throw new SockCommunicationException("Communication Failed");
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
当服务器断开连接时,客户端在发送一些数据之前不知道,因此Connected属性为true.然后行remote.BeginReceive()抛出我试图捕获的SocketException并抛出一个自定义异常(sockCommunicationException).
但是,当我这样做时,我得到一个未处理的异常.我想通过业务层将此错误冒泡到UI.当在回调方法中引发这样的异常时,它会被提升到哪里?
如何避免此未处理的异常并将此异常冒泡到UI层.
请帮忙.
提前致谢!
这是一个常见的要求。
解决方案通常是通过SendData访问某些本地方法来通知客户端操作结果并可能显示在 UI 中。
现在您需要在不同的中间层实现这一点。您的客户端调用服务器,服务器又调用异步方法并触发操作。如果客户端需要了解结果及其异常,它必须轮询服务器并检查结果 - 并且您必须将结果存储在服务器或某个数据库上,直到客户端检索它或在超时 - 清理本身变得复杂。
或者,它可以使用双工方法让服务器与客户端进行通信。这个解决方案听起来不错,但公平地说,由于各种原因很糟糕,这超出了这个问题的范围。
| 归档时间: |
|
| 查看次数: |
2300 次 |
| 最近记录: |