最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中System.IO.Pipelines庫的使用詳解

 更新時(shí)間:2023年12月26日 08:23:50   作者:rjcql  
System.IO.Pipelines 是一個(gè)庫,旨在使在 .NET 中執(zhí)行高性能 I/O 更加容易,本文主要為大家詳細(xì)介紹了System.IO.Pipelines具體使用方法,感興趣的可以了解下

寫在前面

在進(jìn)一步了解Socket粘包分包的過程中,了解到了.NET 中的 System.IO.Pipelines,可以更優(yōu)雅高效的解決這個(gè)問題;先跟隨官方的示例做個(gè)初步的認(rèn)識(shí)。

System.IO.Pipelines 是一個(gè)庫,旨在使在 .NET 中執(zhí)行高性能 I/O 更加容易。 該庫的目標(biāo)為適用于所有 .NET 實(shí)現(xiàn)的 .NET Standard。
System.IO.Pipelines 具有高性能的流數(shù)據(jù)分析功能,可以減少代碼復(fù)雜性。

老規(guī)矩通過NuGet安裝該類庫

代碼實(shí)現(xiàn)

using System.Buffers;
using System.IO.Pipelines;
using System.Text;
 
class Program
{
    static async Task Main()
    {
        using var stream = File.OpenRead("lorem-ipsum.txt");
 
        var reader = PipeReader.Create(stream);
        var writer = PipeWriter.Create(
            Console.OpenStandardOutput(),
            new StreamPipeWriterOptions(leaveOpen: true));
 
        WriteUserCancellationPrompt();
 
        var processMessagesTask = ProcessMessagesAsync(reader, writer);
        var userCanceled = false;
        var cancelProcessingTask = Task.Run(() =>
        {
            while (char.ToUpperInvariant(Console.ReadKey().KeyChar) != 'C')
            {
                WriteUserCancellationPrompt();
            }
 
            userCanceled = true;
 
            // No exceptions thrown
            reader.CancelPendingRead();
            writer.CancelPendingFlush();
        });
 
        await Task.WhenAny(cancelProcessingTask, processMessagesTask);
 
        Console.WriteLine(
            $"\n\nProcessing {(userCanceled ? "cancelled" : "completed")}.\n");
    }
 
    static void WriteUserCancellationPrompt() =>
        Console.WriteLine("Press 'C' to cancel processing...\n");
 
    static async Task ProcessMessagesAsync(
        PipeReader reader,
        PipeWriter writer)
    {
        try
        {
            while (true)
            {
                ReadResult readResult = await reader.ReadAsync();
                ReadOnlySequence<byte> buffer = readResult.Buffer;
 
                try
                {
                    if (readResult.IsCanceled)
                    {
                        break;
                    }
 
                    if (TryParseLines(ref buffer, out string message))
                    {
                        FlushResult flushResult =
                            await WriteMessagesAsync(writer, message);
 
                        if (flushResult.IsCanceled || flushResult.IsCompleted)
                        {
                            break;
                        }
                    }
 
                    if (readResult.IsCompleted)
                    {
                        if (!buffer.IsEmpty)
                        {
                            throw new InvalidDataException("Incomplete message.");
                        }
                        break;
                    }
                }
                finally
                {
                    reader.AdvanceTo(buffer.Start, buffer.End);
                }
            }
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine(ex);
        }
        finally
        {
            await reader.CompleteAsync();
            await writer.CompleteAsync();
        }
    }
 
    static bool TryParseLines(
        ref ReadOnlySequence<byte> buffer,
        out string message)
    {
        SequencePosition? position;
        StringBuilder outputMessage = new();
 
        while (true)
        {
            position = buffer.PositionOf((byte)'\n');
 
            if (!position.HasValue)
                break;
 
            outputMessage.Append(Encoding.ASCII.GetString(buffer.Slice(buffer.Start, position.Value)))
                        .AppendLine();
 
            buffer = buffer.Slice(buffer.GetPosition(1, position.Value));
        };
 
        message = outputMessage.ToString();
        return message.Length != 0;
    }
 
    static ValueTask<FlushResult> WriteMessagesAsync(
        PipeWriter writer,
        string message) =>
        writer.WriteAsync(Encoding.ASCII.GetBytes(message));
}

調(diào)用示例

總結(jié)

例子中用到的文本文件是一個(gè)以\n 換行符作為結(jié)尾的多行文本,微軟官方示例沒有提供,這個(gè)是自己建的測(cè)試文件,如果沒有檢測(cè)到\n會(huì)拋出異常。

 從運(yùn)行的結(jié)果可以看到,從傳入的流中識(shí)別以\n結(jié)尾,作為數(shù)據(jù)塊的區(qū)分,利用這個(gè)特性定義數(shù)據(jù)報(bào)文的尾部,實(shí)現(xiàn)分包。

到此這篇關(guān)于C#中System.IO.Pipelines庫的使用詳解的文章就介紹到這了,更多相關(guān)C# System.IO.Pipelines內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解C#實(shí)現(xiàn)快捷鍵(系統(tǒng)熱鍵)響應(yīng)的方法

    深入理解C#實(shí)現(xiàn)快捷鍵(系統(tǒng)熱鍵)響應(yīng)的方法

    本篇文章是對(duì)使用C#實(shí)現(xiàn)快捷鍵(系統(tǒng)熱鍵)響應(yīng)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#實(shí)現(xiàn)批量刪除PDF頁面(單頁/多頁)的實(shí)戰(zhàn)技巧

    C#實(shí)現(xiàn)批量刪除PDF頁面(單頁/多頁)的實(shí)戰(zhàn)技巧

    在自動(dòng)化文檔處理流程中,PDF 文件可能因?qū)С鲥e(cuò)誤、內(nèi)容重復(fù)或格式轉(zhuǎn)換問題而包含多余頁面,本文演示如何使用免費(fèi)庫 Free Spire.PDF for .NET 刪除 PDF 文件中的單個(gè)或多個(gè)頁面,希望對(duì)大家有所幫助
    2026-04-04
  • 詳解C#如何實(shí)現(xiàn)隱式類型轉(zhuǎn)換

    詳解C#如何實(shí)現(xiàn)隱式類型轉(zhuǎn)換

    Result?類型是許多編程語言中處理錯(cuò)誤的常用方式,包括?C#?的?dotNext?庫。在本文中,我們將通過例子回顧?C#?中?using?語句和隱式類型轉(zhuǎn)換的使用,感興趣的可以了解一下
    2023-01-01
  • C#中線程同步對(duì)象的方法分析

    C#中線程同步對(duì)象的方法分析

    這篇文章主要介紹了C#中線程同步對(duì)象的方法,較為詳細(xì)的分析了線程同步的原理與實(shí)現(xiàn)方法,并給出了實(shí)例總結(jié),是比較實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • C# 中 Array和 ArrayList詳解及區(qū)別

    C# 中 Array和 ArrayList詳解及區(qū)別

    這篇文章主要介紹了C# 中 Array和 ArrayList詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C#基于TimeSpan實(shí)現(xiàn)倒計(jì)時(shí)效果的方法

    C#基于TimeSpan實(shí)現(xiàn)倒計(jì)時(shí)效果的方法

    這篇文章主要介紹了C#基于TimeSpan實(shí)現(xiàn)倒計(jì)時(shí)效果的方法,比較實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • C# Aspose.Words 刪除word中的圖片操作

    C# Aspose.Words 刪除word中的圖片操作

    這篇文章主要介紹了C# Aspose.Words 刪除word中的圖片操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • c#反射表達(dá)式樹模糊搜索示例

    c#反射表達(dá)式樹模糊搜索示例

    這篇文章主要介紹了c#反射表達(dá)式樹模糊搜索示例,反射實(shí)體T,非datetime字段反射獲取表達(dá)式樹,需要的朋友可以參考下
    2014-02-02
  • C# cefSharep控件的使用詳情

    C# cefSharep控件的使用詳情

    本文主要介紹了C# cefSharep控件的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • C#中DataGridView操作技巧

    C#中DataGridView操作技巧

    這篇文章主要介紹了C#中DataGridView操作技巧,包括了DataGridView的初始化、添加行、添加列、排序等操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

贵德县| 湖北省| 玉溪市| 湘乡市| 策勒县| 定远县| 会理县| 和田市| 潍坊市| 山阳县| 清苑县| 大石桥市| 綦江县| 城固县| 衡水市| 宝应县| 临桂县| 桂平市| 海原县| 沿河| 滦南县| 七台河市| 望城县| 寿宁县| 沂源县| 肥东县| 杭锦后旗| 靖宇县| 高碑店市| 阿合奇县| 山阳县| 岑溪市| 望江县| 清水县| 南华县| 宣威市| 全州县| 内丘县| 施秉县| 三穗县| 运城市|