gpt4 book ai didi

c# - 异步内存流处理方法 : which of the following?

转载 作者:太空狗 更新时间:2023-10-29 22:16:14 24 4
gpt4 key购买 nike

我正在研究使用异步内存流的解决方案,我正在考虑实现此类的正确方法。哪个更方便?第一个,简单:

//First approach: linear async
private async static Task WriteToStreamFirstVariant()
{
MemoryStream memoryStream = new MemoryStream();
byte[] data = new byte[256];
try
{
await memoryStream.WriteAsync(data, 0, data.Length);
}
catch(Exception exception)
{
//Handling exception
}
finally
{
memoryStream.Dispose();
}
}

或者第二个带有嵌套任务和闭包?

//Second approach: nested tasks async
private async static Task WriteToStreamSecondVariant()
{
await Task.Run(async () =>
{
byte[] data = new byte[256];
using (MemoryStream memoryStream = new MemoryStream())
{
await memoryStream.WriteAsync(data, 0, data.Length)
.ContinueWith((Task writingTask) =>
{
//Handling exceptions
AggregateException exceptions = writingTask.Exception;
});
}
});
}

最佳答案

事实是 MemoryStreamRead/WriteAsync 方法实际上并没有提供任何类型的真正的异步实现。它们所做的只是同步执行操作并返回一个已经完成的Task。因此,当您知道它是一个 MemoryStream 时调用异步方法没有任何好处。事实上,这完全是不必要的开销。

现在,暂时忘记回答您关于风格的问题,第一种方法更好,因为您不会不必要地分配/安排新的 Task(例如使用 Task::Run),但我不知道您为什么不在该方法中使用 using() 语句。所以这是最干净/最简单的恕我直言:

private async static Task WriteToStreamFirstVariantSimplified()
{
using(MemoryStream memoryStream = new MemoryStream())
{
byte[] data = new byte[256];

try
{
await memoryStream.WriteAsync(data, 0, data.Length);
}
catch(Exception exception)
{
//Handling exception
}
}
}

关于c# - 异步内存流处理方法 : which of the following?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com