【.net 深呼吸】通過標準輸入/輸出流來完成處理序間通訊

來源:互聯網
上載者:User

標籤:讀取資料   .com   get   朋友   方式   取資料   start   代碼   網路   

實現進程之間煲電話粥的方式,有好幾種,比如,你可以用這些方案:

1、使用socket來傳遞。這個好像很無聊,本地進程之間也用socket?不過,通過本機迴環網路確實可以進程之間通訊。

2、WCF,與上面的相似,也是利用本機迴環地址來在處理序間通訊。

3、記憶體對應檔。這個可能有些朋友不太熟,畢竟平時裝逼時也裝不上這個。記憶體對應檔類似於磁碟中的物理檔案,只不過它是存在於記憶體中的,一旦引用檔案的最後一個進程退出,記憶體對應檔就會釋放。多個進程間可以共用記憶體映檔案來分享銀行卡上的錢。

 

本文老周還介紹第 4 種方案——通過標準的輸入/輸出流來讀寫。輸入資料流是向一個進程寫入資料,相反地,輸出資料流就是從某個進程讀取資料。

原理不複雜,實現起來也不難,只需要用到一個我們都很熟悉的類:Console,這個類不僅可以在控制台應用程式中輸入/輸出文本,也可以用於標準流。

 

好,老周用一個例子來說明一下。

這個例子是這樣的,假設有一個可執行檔,它沒有UI,只是用於安裝,在安裝過程中,它會即時輸出安裝進度。然後,有另外一個程式,有視窗,這個程式會調用前面那個程式進行安裝,並即時讀出安裝進度,顯示到進度條控制項上。

 

首先實現第一個程式,無視窗無UI無房無車,純屌絲一個。

    class MainClass    {        static void Main()        {            BinaryWriter writer = new BinaryWriter(Console.OpenStandardOutput());            byte p = 0;            do            {                writer.Write(p);                Thread.Sleep(50);                p++;            }            while (p <= 100);            writer.Close();        }    }

擷取標準流,可以調用 OpenStandardOutput,或OpenStandardInput,這兩個方法返回的流對象,可以靈活操作。還可以訪問 Out / In 屬性來擷取標準流,它返回的是 TextReader 或 TextWriter,這用於讀寫文本較方便。

此處,老周只考慮寫一個數值(0 - 100),所以,用 BinaryWriter 類操作會快樂一點。

這個項目,你既能產生為控制台應用程式,也可以是Windows應用程式,只要是.exe即可。

 

隨後,我們實現有視窗有UI有房有車,純壕一個。

            string exePath = @"..\..\..\SampleApp\bin\Debug\SampleApp.exe";            IProgress<int> prgs = new Progress<int>(p =>             {                 progressBar1.Value = p;             });            ……            await Task.Run(() =>            {                ProcessStartInfo start = new ProcessStartInfo();                start.FileName = exePath; //要執行的.exe檔案                start.CreateNoWindow = true; //無視窗                start.UseShellExecute = false; //非Shell行為                start.RedirectStandardOutput = true; //必須,否則連毛都不出來                Process p = Process.Start(start);                BinaryReader reader = new BinaryReader(p.StandardOutput.BaseStream);                while (true)                {                    byte prs = reader.ReadByte();                    prgs.Report(prs);                    if (prs == 100) break;                }                reader.Close();                p.WaitForExit();                p.Close();            });            ……

IProgress<T>是個好東西,它的實作類別是 Progress<T>,只要我們在UI線程上把它執行個體化(即它的執行個體屬於UI線程),那麼在跨線程報告進度時會簡便很多。執行個體化時,傳一個Action<T>委託執行個體,用來回調進度。

啟動進程前要準備一個 ProcessStartInfo,它可以設定一些參數。

如:

                ProcessStartInfo start = new ProcessStartInfo();                start.FileName = exePath; //要執行的.exe檔案                start.CreateNoWindow = true; //無視窗                start.UseShellExecute = false; //非Shell行為                start.RedirectStandardOutput = true; //必須,否則連毛都不出來

反正安裝程式是沒有UI的,就讓CreateNoWindow為真,不建立主視窗。另外,RedirectStandardOutput屬性必須為真,不然我們代碼就無法訪問輸入/輸出流,只有重新導向後的標準流才能在代碼中使用。

 

運行結果如所示。

 

 當然,你也可以用標準流來讀寫文本,或其他資料,這裡讀寫數值,只作示範。

範例程式碼

 

【.net 深呼吸】通過標準輸入/輸出流來完成處理序間通訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.