C# 創建匿名管道

c503e3e4f13a1c22064d55778c2064b9.png

下面對匿名管道執行類似的操作。通過匿名管道,創建兩個彼此通信的任務。為了給管道的創建發出信號,使用 ManualResetEventSlim 對象,與內存映射文件一樣。在 Program 類的 Run 方法中,創建兩個任務,調用 Reader 和 Writer 方法:

private?string?_pipeHandle;?
private ManualResetEventSlim _pipeHandleSet; static void Main()
{var?p = new?Program();?p.Run();?Console.ReadLine();
}public void Run()
{ _pipeHandleSet = new ManualResetEventSlim(initialState: false); Task.Run(() => Reader()); Task.Run(() => Writer());Console.ReadLine();
}

0457fc0fbb8e279d290e0ebbe3d4c05e.png

創建一個 AnonymousPipeServerStream,定義 PipeDirection.In,把服務器端充當讀取器。通信的另一端需要知道的客戶端句柄。這個句柄在GetClientHandleAsString 方法中轉換為一個字符串,賦予 _pipeHandle 變量。這個變量以后由充當寫入器的客戶端使用。在最初的處理后,管道服務器可以作為一個流,因為它本來就是一個流:

private void Reader() 
{try{var pipeReader = newAnonymousPipeServerStream(PipeDirection.In,HandleInheritability.None);using?(var?reader =?new?StreamReader(pipeReader)){_pipeHandle = pipeReader.GetClientHandleAsString(); Console.WriteLine($"pipe handle: {_pipeHandle}"); _pipeHandleSet.Set(); bool end = false; while (!end){string line = reader.ReadLine(); Console.WriteLine(line);if (line == "end") end = true;}Console.WriteLine("finished?reading");}}catch (Exception ex){Console.WriteLine(ex.Message);}
}

1ddff4b5a9d8fda3cc73261cc0565de2.png

客戶端代碼等到變量 _pipeHandleSet 發出信號,就打開由 _pipeHandle 變量引用的管道句柄。后來的處理用 StreamWriter 繼續:

private void Writer()
{Console.WriteLine("anonymous pipe writer");_pipeHandleSet.Wait();var?pipeWriter?=?new?AnonymousPipeClientStream(?PipeDirection.Out,?_pipeHandle);using (var writer = new StreamWriter(pipeWriter)){writer.AutoFlush = true;Console.WriteLine("starting writer");for (int i = 0; i < 5; i++){writer.WriteLine($"Message {i}");Task.Delay(500).Wait();}writer.WriteLine("end");}
}

859d4e860d2fa6160233f311edb98a27.png

運行應用程序時,兩個任務就相互通信,在任務之間發送數據。

f363c8d07378758b51e90ead80067c8c.png

9075b9fb82b2d868c8a78bf602402337.png

?微信公眾號?

DotNet講堂

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287842.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287842.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287842.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

內測投票

create table DiaoYanTiMu &#xff08;  Ids int(10) auto_increment not null primary key(),//把所需要的都寫上中間不需要符號隔開&#xff0c;設自增長列類型必須是int&#xff0c;主鍵的話必須不能為空not null&#xff0c; Title varchar(50) not null &#xff09;;/…

Android之通過Binder機制實現IPC和linux的傳統IPC的對比分析

一、 Android的Binder機制實現IPC 這里bind機制實現實現IPC模型這里不具體分析,簡單理解就是clint-server模型 涉及到4個模塊client、server、serverManager、bind底層驅動。 serverManager的作用是將字符形式的Binder(Server創建了Binder實體)名字轉化成Client中對該Bin…

Mysql 查詢統計練習

2019獨角獸企業重金招聘Python工程師標準>>> 1、建表 customers 顧客表 products 產品表 orders 訂單表 -- 顧客表 CREATE TABLE customers (c_id INT NOT NULL AUTO_INCREMENT,lastname VARCHAR(255),firstname VARCHAR(255),address VARCHAR(255),birthday DATETI…

【經典回放】多種語言系列數據結構算法:堆排序

目錄 一、堆排序算法分析 二、C#語言實現堆排序 三、C語言實現堆排序 一、堆排序算法分析

C++11模版元編程的應用

1.概述 關于C11模板元的基本用法和常用技巧&#xff0c;我在程序員2015年2月B《C11模版元編程》一文&#xff08;后稱前文&#xff09;中已經做了詳細地介紹&#xff0c;那么C11模版元編程用來解決什么實際問題呢&#xff0c;在實際工程中又該如何應用呢&#xff1f;本文將側重…

《零基礎看得懂的C語言入門教程 》——(二)C語言沒那么難簡單開發帶你了解流程

一、學習目標 了解DevC集成開發環境了解集成開發環境了解HelloWorld程序了解HelloWorld程序的編寫方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1…

11選5下期算法_本周六周日【高二直播】輔導網課預告:通用技術電控二三極管、多用電表測量、數字邏輯電路、解析枚舉遞歸算法,2022浙江選考技術...

01第19-21講 2020年11月28日29日開課目錄鯨學名師考點精講系統提高高二共3階段精品課夯實基礎沖刺技術選考97-100分&#xff01;11月28日【高二|提高|直播】高二精品直播課講授&#xff1a;浙江選考技術科目第19講 高二綜合提高鯨學名師講授高中通用技術&#xff1a;第19講 電控…

十分鐘完成Bash 腳本進階!列舉Bash經典用法及其案例

前言&#xff1a;在linux中&#xff0c;Bash腳本是很基礎的知識&#xff0c;大家可能一聽腳本感覺很高大上&#xff0c;像小編當初剛開始學一樣&#xff0c;感覺會寫腳本的都是大神。雖然復雜的腳本是很燒腦&#xff0c;但是&#xff0c;當我們熟練的掌握了其中的用法與技巧&am…

【經典回放】多種語言系列數據結構算法:基數排序

目錄 一、算法思路 二、C#語言實現 三、C語言實現 一、算法思路 1. 思想基礎 基數排序的思想就是先找出待排序中的最大者&#xff0c;然后按最大者申請一個足夠大的內存空間&#xff0c;并將其初始化為零&#xff0c;然后將所有待排序的數裝入其中&#xff0c;標記裝入的數…

Java之ThreadPoolExcutor和四種常見的線程池

一、ThreadPoolExcutors的作用 java提供了ThreadPoolExcutors來創建一個線程池&#xff0c;我們為什么要用線程池呢? 1.降低資源的消耗&#xff1a;通過重復利用已經創建好的線程降低線程的創建和銷毀帶來的損耗 2.提高響應速度&#xff1a;因為線程池中的線程處于等待分配任…

探索鏈路追蹤在.NET6工業物聯網項目中的應用

如果覺得有用&#xff0c;請留言學到了。已經會了的老哥&#xff0c;請留言就這&#xff1f;可能遇到的問題工業物聯網系統自上而下一般分為ERP、Mes、SCADA、WCS、邊緣網關、設備等一個生產訂單從SAP發送到設備要經過上述多個系統&#xff0c;當某個環節出現問題&#xff0c;可…

《零基礎看得懂的C語言入門教程 》——(三)輕輕松松理解第一個C語言程序

一、學習目標 了解C語言代碼的一般結構了解函數的概念了解printf函數的使用方法了解頭文件的概念了解system函數的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤…

hdu_1728_逃離迷宮(bfs)

題目連接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1728 題意&#xff1a;走迷宮&#xff0c;找最小的拐角 題解&#xff1a;對BFS有了新的理解&#xff0c;DFS剪枝應該也能過&#xff0c;用BFS就要以拐角作為增量來搜&#xff0c;即以當前點為坐標&#xff0c;4…

把文件放在SD卡

2019獨角獸企業重金招聘Python工程師標準>>> 在程序中訪問SDCard&#xff0c;你需要申請訪問SDCard的權限。 在AndroidManifest.xml中加入訪問SDCard的權限如下: <!-- 在SDCard中創建與刪除文件權限--> <uses-permissionandroid:name"android.permiss…

python分層聚類集群合并_24、python分層聚類案例(scipy方法)

目錄1、分層聚類算法2、方法3、分析步驟4、案例1、分層聚類算法層次聚類算法又稱為樹聚類算法&#xff0c;它根據數據之間的距離&#xff0c;透過一種層次架構方式&#xff0c;反復將數據進行聚合&#xff0c;創建一個層次以分解給定的數據集。2、方法01 聚類方法linkagescipy.…

【經典回放】多種語言系列數據結構算法:數組

數組如同前面學過的順序表,一次性申請一片地址連續的存儲空間,我們還知道,計算機中數組是以一維的形式存儲的,因為計算機的內存的一維的。在知道了多維數據的計算機存儲方式后,我們還要知道構造一個多維數據的方法,并構造ADT,具體做法如下所示: 內容和步驟: 1、C語言中…

stl中Priority Queues(優先隊列)的基本用法

博客搬家啦 blog.ma6174.comstl中Priority Queues(優先隊列)的基本用法 C優先隊列類似隊列&#xff0c; 但是在這個數據結構中的元素按照一定的斷言排列有序。 C Priority Queues(優先隊列) empty 語法: bool empty(); empty()函數返回真(true)如果優先隊列為空&#xff0c;否則…

如何用 windbg 導出 C# 中的 string 內容?

咨詢區 driis我在用 windbg 調試一個生產上的 程序卡死 故障 &#xff0c;在線程棧上有一個 string 類型的參數相當大&#xff0c;我用 !dumpobj 命令不能正常顯示內容&#xff0c;參考如下&#xff1a;0:036> !do 00000001b30d8668 Name: System.String MethodTable: 00000…

《零基礎看得懂的C語言入門教程 》——(四)C語言的基本數據類型及變量

一、學習目標 了解C語言的基本數據類型了解變量的基本概念了解變量的使用方法了解了變量的命名方法了解格式占位符了解變量的輸出 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離…

android一句話搞定圖片加載

http://square.github.io/picasso/ Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); gradle中添加 compile com.squareup.picasso:picasso:2.5.2 轉載于:https://www.cnblogs.com/rwxwsblog/p/5467874.html