繁体   English   中英

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

[英]Asynchronous memory streaming approach: which of the following?

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

//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
        }
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM