C# 立即返回流,然后异步写入流
在我当前的代码中,我有这样一种从设备读取数据的方法(伪代码): 这个设计好吗?我特别关注线程安全、lambda中使用的流对象的生存期以及异常处理 还是有更好的模式来解决这类问题 编辑 事实上,我刚刚想出了另一个设计,看起来更干净。我让数据消费者提供流,而不是让C# 立即返回流,然后异步写入流,c#,asynchronous,stream,streamwriter,memorystream,C#,Asynchronous,Stream,Streamwriter,Memorystream,在我当前的代码中,我有这样一种从设备读取数据的方法(伪代码): 这个设计好吗?我特别关注线程安全、lambda中使用的流对象的生存期以及异常处理 还是有更好的模式来解决这类问题 编辑 事实上,我刚刚想出了另一个设计,看起来更干净。我让数据消费者提供流,而不是让ReadAllDataFromDevice()函数返回流,如下所示: public async Task<Stream> ReadAllDataFromDevice() { var stream = new Memory
ReadAllDataFromDevice()
函数返回流,如下所示:
public async Task<Stream> ReadAllDataFromDevice()
{
var stream = new MemoryStream();
using (var device = new Device())
using (var streamWriter = new StreamWriter(stream, new UTF8Encoding(), 512, true))
{
while(device.HasMoreData)
{
var line = await device.ReadLineAsync();
await streamWriter.WriteLineAsync(line);
}
await streamWriter.FlushAsync();
}
return stream;
}
public async Task ReadAllDataFromDevice(Stream stream)
{
using (var device = new Device())
using (var streamWriter = new StreamWriter(stream, new UTF8Encoding(), 512, true))
{
while(device.HasMoreData)
{
var line = await device.ReadLineAsync();
await streamWriter.WriteLineAsync(line);
}
await streamWriter.FlushAsync();
}
}
await ReadAllDataFromDevice(async stream => {
using (var streamReader(stream))
{
var data = await streamReader.ReadToEndAsync();
// do something with data
}
});
这就是我现在使用的设计:
public async Task ReadAllDataFromDevice(Func<Stream, Task> readCallback)
{
using (var device = new Device())
{
await device.Initialize();
using (var stream = new DeviceStream(device))
{
await readCallback(stream);
}
}
}
您如何知道何时不再接收数据?这行没有意义:device.HasMoreData。
public async Task ReadAllDataFromDevice(Func<Stream, Task> readCallback)
{
using (var device = new Device())
{
await device.Initialize();
using (var stream = new DeviceStream(device))
{
await readCallback(stream);
}
}
}
await ReadAllDataFromDevice(async stream => {
using (var streamReader(stream))
{
var data = await streamReader.ReadToEndAsync();
// do something with data
}
});