我是一个新的.NET开发人员,我正在阅读async
/await
。我需要处理一个框架,用于测试通过使用TCP远程访问服务器以及从这些服务器读取/写入数据来控制的设备。这将用于单元测试。不断从NetworkStream读取异步
没有应用层协议,服务器可能会根据外部事件发送数据。因此,我必须能够连续捕获来自服务器的任何数据并将其写入缓冲区,并可以从不同的上下文中读取。
我的想法去某处沿下面的代码片段的台词:
// ...
private MemoryStream m_dataBuffer;
private NetworkStream m_stream;
// ...
public async void Listen()
{
while (Connected)
{
try
{
int bytesReadable = m_dataBuffer.Capacity - (int)m_dataBuffer.Position;
// (...) resize m_dataBuffer if necessary (...)
m_stream.ReadTimeout = Timeout;
lock (m_dataBuffer)
{
int bytesRead = await m_stream.ReadAsync(m_dataBuffer.GetBuffer(),
(int)m_dataBuffer.Position, bytesReadable);
m_stream.Position += bytesRead;
}
}
catch (IOException ex)
{
// handle read timeout.
}
catch (Exception)
{
throw new TerminalException("ReadWhileConnectedAsync() exception");
}
}
}
这似乎有以下缺点:
- 如果在调用和等待
Listen
功能,主叫挂机,甚至尽管调用者必须能够继续(因为只要连接打开,网络流应该被读取)。 - 如果声明它为
async void
而不等待它,则应用程序在任务中发生异常时会崩溃。 - 如果声明
async Task
而不是等待它,我假设发生同样的事情(加上我得到一个警告)?
以下问题随之而来:
- 我能赶上在
Listen
抛出,如果我不期待它的异常? - 有没有更好的方法来使用
async
/await
不断从网络流中读取? - 尝试使用
async
/await
从网络流中连续读取或者是一个线程是一个更好的选择是否实际上理智?
假设你正在使用.NET Framework 4.5,当在异步方法未处理的异常处理不应该赶上。从异步无效方法抛出异常又有什么意义(因为它不能被注意到)? – 2014-11-25 13:02:08