Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 立即返回流,然后异步写入流_C#_Asynchronous_Stream_Streamwriter_Memorystream - Fatal编程技术网

C# 立即返回流,然后异步写入流

C# 立即返回流,然后异步写入流,c#,asynchronous,stream,streamwriter,memorystream,C#,Asynchronous,Stream,Streamwriter,Memorystream,在我当前的代码中,我有这样一种从设备读取数据的方法(伪代码): 这个设计好吗?我特别关注线程安全、lambda中使用的流对象的生存期以及异常处理 还是有更好的模式来解决这类问题 编辑 事实上,我刚刚想出了另一个设计,看起来更干净。我让数据消费者提供流,而不是让ReadAllDataFromDevice()函数返回流,如下所示: public async Task<Stream> ReadAllDataFromDevice() { var stream = new Memory

在我当前的代码中,我有这样一种从设备读取数据的方法(伪代码):

这个设计好吗?我特别关注线程安全、lambda中使用的流对象的生存期以及异常处理

还是有更好的模式来解决这类问题

编辑

事实上,我刚刚想出了另一个设计,看起来更干净。我让数据消费者提供流,而不是让
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
    }
});