异步内存流方式:以下哪项?

Ily*_*huk 5 c# asynchronous memorystream async-await

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

//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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

//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;
                });
        }
    }); 
}
Run Code Online (Sandbox Code Playgroud)

Dre*_*rsh 13

事实是,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
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是不要在这里使用异步.这个答案中的代码片段显示了一个不好的做法.我担心有人可能会复制并使用它. (4认同)