亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c# 如何實現(xiàn)不同進(jìn)程之間的通信

 更新時間:2020年11月05日 08:31:35   作者:一只獨行的猿  
這篇文章主要介紹了c# 如何實現(xiàn)不同進(jìn)程之間的通信,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下

  進(jìn)程之間的通信是為了解決不同進(jìn)程之間的數(shù)據(jù)傳輸問題,這樣可以讓不同程序交互數(shù)據(jù)。實現(xiàn)進(jìn)程通信的方式:1、剪切板;2、COM;3、內(nèi)存映射文件;4、WCF

1、剪切板Clipboard在進(jìn)程間傳送對象

  剪切板是一個供應(yīng)用程序使用的公有區(qū)域。在.NET中定一個了一個DataFormats類,此類包含一些靜態(tài)字段,定義了剪切板中可以存放的數(shù)據(jù)類型。使用Clipboard類可以向剪切板中放入數(shù)據(jù)。

  如將文字放入剪切板,使用方法SetDataObject即可:Clipboard.SetDataObject("剪切板文字2"); 在讀取的時候,先判斷剪切板中是否有文字,然后再讀?。?/p>

IDataObject data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.Text))
{
  label1.Text = data.GetData(DataFormats.Text).ToString();
}

  將自定義的數(shù)據(jù)放置到剪切板,自定義一個圖片類,并標(biāo)記為可序列化(此處使用的命名空間是:TestClipboard)。將自定義數(shù)據(jù)類型對象放置到剪切板的關(guān)鍵是DataObject類,它實現(xiàn)了IDataObject接口。它就像一個容器,存放將被放置在剪切板上的數(shù)據(jù)。

[Serializable]
public class MyPic
{
  /// <summary>
  /// 圖片
  /// </summary>
  public Image Img;
  /// <summary>
  /// 圖片信息
  /// </summary>
  public string ImgInfo;
}
public void SetMyPicToClipboard()
{
  MyPic obj = new MyPic();
  obj.Img = Properties.Resources.Image;
  obj.ImgInfo = "測試將自定義類型保存至剪切板";
  //創(chuàng)建數(shù)據(jù)對象,并將數(shù)據(jù)裝入
  IDataObject dataObj = new DataObject(obj);

  //其他類型也可以放置在同一數(shù)據(jù)對象中
  /*
  dataObj.SetData(DataFormats.UnicodeText, "測試文字");
  dataObj.SetData(DataFormats.Bitmap, Properties.Resources.Image);
   */
  //復(fù)制到剪切板,第二個參數(shù)表示程序退出時不清空
  Clipboard.SetDataObject(dataObj, true);
}

  但是,使用Clipboard.SetDataObject方法將一個DataObject對象放到剪切板后,外界訪問時,需要指定對象的完整類型名稱。如果某種數(shù)據(jù)類型只能在指定的進(jìn)程中訪問,則可以使用該方式,指定命名空間。

//首先判斷剪切板上是否有我的數(shù)據(jù):需要完全限定命名空間類型
 if (Clipboard.ContainsData("WindowsFormsApplication1.MyPic"))
 {
   IDataObject dataObj = Clipboard.GetDataObject();//讀取數(shù)據(jù)
   MyPic myPic = dataObj.GetData("WindowsFormsApplication1.MyPic") as MyPic;//轉(zhuǎn)換數(shù)據(jù)
   pictureBox1.Image = myPic.Img;
   textBox1.Text = myPic.ImgInfo;
 }

2、使用FileSystemWatcher實現(xiàn)進(jìn)程同步

  該組件可以監(jiān)控特定的文件夾或文件,比如在此文件夾中某文件被刪除或內(nèi)容被改變時引發(fā)對應(yīng)的事件。通過該組件讓多個進(jìn)程同時監(jiān)控一個文件,以此可以充當(dāng)“臨時”進(jìn)程間通信渠道。
  實現(xiàn)進(jìn)程同步的關(guān)鍵點是:正確設(shè)置文件的共享和讀寫權(quán)限。

/// <summary>
/// 實現(xiàn)寫入數(shù)據(jù)
/// </summary>
/// <param name="fileName"></param>
public void SetText(string fileName)
{
  using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read))
  {
    using (StreamWriter writer = new StreamWriter(fs, Encoding.UTF8))
    {
      writer.Write("內(nèi)容");
    }
  }
}
/// <summary>
/// 實現(xiàn)讀取數(shù)據(jù)
/// </summary>
/// <param name="fileName"></param>
public void ReadText(string fileName)
{
  using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
  {
    using (StreamReader reader = new StreamReader(fs, Encoding.UTF8))
    {
      string txt = reader.ReadToEnd();
    }
  }
}

  然后,使用FileSystemWatcher組件的Changed事件監(jiān)控文件是否發(fā)生改變。在網(wǎng)絡(luò)應(yīng)用程序中,可以使用此組件監(jiān)控特定的專用于上傳文件的文件夾,當(dāng)發(fā)現(xiàn)用戶上傳文件之后,系統(tǒng)可以自動啟動一系列的處理流程。

3、使用內(nèi)存映射文件(Memory Mapped File)實現(xiàn)進(jìn)程通信

  含義:在內(nèi)存中開辟一塊存放數(shù)據(jù)的專用區(qū)域,這區(qū)域與硬盤上特定的文件相對應(yīng)。進(jìn)程將這塊內(nèi)存區(qū)域映射到自己的地址空間中,完成像訪問普通內(nèi)存一樣訪問它。windows中的系統(tǒng)分頁文件和休眠文件就是如此實現(xiàn)的。需要引用命名空間System.IO.MemoryMappedFiles。

  MemoryMappedFile對象表示一個內(nèi)存映射文件,通過它的CreateFromFile方法根據(jù)磁盤現(xiàn)有文件創(chuàng)建內(nèi)存映射文件(注意,使用完后要立即釋放資源,實際上它對應(yīng)的是操作系統(tǒng)的核心對象)。其中,內(nèi)存映射的容量在未指定時,默認(rèn)與文件大小相等。在指定大小時,它的值不能小于文件的現(xiàn)有大小。若指定的大小大于磁盤文件大小,磁盤文件會自動增長到內(nèi)存映射文件聲明的容量大小。

  創(chuàng)建MemoryMappedFile對象后,不能直接對其進(jìn)行讀寫,必須使用MemoryMappedViewAccessor對象(內(nèi)存映射視圖訪問對象)操作 ??梢杂肕emoryMappedFile對象的方法創(chuàng)建一個訪問對象。其中,可以指定需要訪問文件的范圍,從第幾個字節(jié)到第幾個字節(jié)。在寫入?yún)?shù)時,也需要指明想哪個位置寫入什么。同時也可以使用MemoryMappedViewAccessor的Read方法讀取數(shù)據(jù)。

MemoryMappedFile memoryFile = MemoryMappedFile.CreateFromFile("Text.Config", FileMode.OpenOrCreate, "Config", 1400);//kb;
MemoryMappedViewAccessor accessor = memoryFile.CreateViewAccessor(0, 1024);
accessor.Write(0, '2');

  在同一個進(jìn)程中,可以針對同一個內(nèi)存映射文件創(chuàng)建多個“內(nèi)存映射視圖訪問對象”,從而允許同時修改同一個文件的不同部分,在關(guān)閉這些對象時,由操作系統(tǒng)保證將所有修改都寫回原始文件。

  MemoryMappedViewAccessor 的Write和Read有泛型方法,單類型只能是結(jié)構(gòu)體類型(應(yīng)用類型在程序運(yùn)行時,計算機(jī)無法知道應(yīng)該向內(nèi)存映射文件寫入多少字節(jié)數(shù)據(jù),引用類型的對象位于托管堆中,其大小需要經(jīng)過計算,但非常耗時(而且對象可能引用了其他對象),音效內(nèi)存映射文件的效率)。
  可以使用序列化方式,將引用對象數(shù)據(jù)進(jìn)行序列化后,寫入內(nèi)存映射文件中。

MemoryMappedFile memoryFile = MemoryMappedFile.CreateFromFile("Text.Config", FileMode.OpenOrCreate, "Config", 1400);//kb;
MemoryMappedViewStream stream = memoryFile.CreateViewStream();
MyPic obj = new MyPic();
stream.Seek(0, SeekOrigin.Begin);
new BinaryFormatter().Serialize(stream, obj);

4、使用WCF通過管道實現(xiàn)進(jìn)程通信

  “管道(Pipe)”是Windows所提供的一種進(jìn)程間通信機(jī)制,用于在兩個進(jìn)程間相互傳送數(shù)據(jù)。Windows提供了兩種類型管道:匿名管道(Anonymous Pipe)、命名管道(Named Pipe)

  • 匿名管道:只允許單向通信,由于沒有名字,因此要通信的兩個進(jìn)程應(yīng)該是父子關(guān)系,父進(jìn)程在創(chuàng)建子進(jìn)程時,負(fù)責(zé)將代表匿名管道的句柄傳送給子進(jìn)程,子進(jìn)程可以通過該句柄獲取父進(jìn)程傳輸?shù)臄?shù)據(jù)。其優(yōu)點是占用資源少、效率高;缺點是通信進(jìn)程必須為父子關(guān)系,限制了使用場景。
  • 命名管道:這種類型的管道擁有一個在本機(jī)唯一的名字,可以用于在一個服務(wù)進(jìn)程和多個客戶進(jìn)程之間進(jìn)行單/雙向通信。命名管道是基于消息的通信模式,即一個進(jìn)程一次可以向另一方進(jìn)程連續(xù)發(fā)生多個消息(消息之間通過消息的定界符進(jìn)行劃分),接收方通過定界符提取完整的消息。

  在命名空間System.IO.Pipes中,提供了一些用于實現(xiàn)基于管道的進(jìn)程間通信,如AnonymousPipeClientStream和AnonymousPipeServerStream可用于實現(xiàn)匿名管道,而NamedPipeClientStream和NamedPipeServerStream可以實現(xiàn)命名管道。但相對于WCF,其比較繁瑣,WCF的管道進(jìn)程通信更加簡便和靈活。

  WCF應(yīng)用程序使用命名管道實現(xiàn)進(jìn)程通信:WCF提供了一個NetNamedPipeBinding綁定,它可以在地層使用命名管道實現(xiàn)進(jìn)程通信。

以上就是c# 如何實現(xiàn)不同進(jìn)程之間的通信的詳細(xì)內(nèi)容,更多關(guān)于c# 進(jìn)程通信的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c#.net 常用函數(shù)和方法集

    c#.net 常用函數(shù)和方法集

    c#.net 常用函數(shù)和方法集 ,學(xué)習(xí)的朋友可以參考下。
    2009-07-07
  • WPF中下拉框可作選擇項也可以作為只讀文本框使用的方法

    WPF中下拉框可作選擇項也可以作為只讀文本框使用的方法

    這篇文章主要給大家介紹了關(guān)于WPF中下拉框可以選擇項也可以作為只讀文本框使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-02-02
  • 基于C#實現(xiàn)Windows服務(wù)的方法詳解

    基于C#實現(xiàn)Windows服務(wù)的方法詳解

    在實際應(yīng)用過程中,有時候我們希望開發(fā)的程序,不需要界面,直接開機(jī)就可以長時間運(yùn)行,這時候,我們可以考慮做成一個Windows服務(wù)。這篇文章跟大家介紹一下,如何基于C#實現(xiàn)Windows服務(wù)的創(chuàng)建、安裝、啟動、停止和卸載,需要的可以參考一下
    2022-09-09
  • C#實現(xiàn)JSON字符串序列化與反序列化的方法

    C#實現(xiàn)JSON字符串序列化與反序列化的方法

    在這篇文章中,我們將會學(xué)到如何使用C#,來序列化對象成為Json格式的數(shù)據(jù),以及如何反序列化Json數(shù)據(jù)到對象。
    2017-01-01
  • C#適配器模式的使用

    C#適配器模式的使用

    本文主要介紹了C#適配器模式的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#實現(xiàn)FTP上傳文件的方法

    C#實現(xiàn)FTP上傳文件的方法

    這篇文章介紹了C#實現(xiàn)FTP上傳文件的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 詳解C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算

    詳解C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算

    這篇文章主要為大家詳細(xì)介紹了C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C#迭代器方法介紹

    C#迭代器方法介紹

    這篇文章主要介紹了C#迭代器方法,可以使用foreach循環(huán)語句進(jìn)行的迭代的方法,稱為可迭代方法,或者迭代器方法,方法操作,想了解更多內(nèi)容得小伙伴可以學(xué)習(xí)下面文章內(nèi)容,希望給你的學(xué)習(xí)帶來幫助
    2022-03-03
  • Unity后處理效果之邊角壓暗

    Unity后處理效果之邊角壓暗

    這篇文章主要為大家詳細(xì)介紹了Unity后處理效果之邊角壓暗,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • c# 遞歸訪問文件夾(刪掉歌詞文件)

    c# 遞歸訪問文件夾(刪掉歌詞文件)

    今天想把我的音樂里面500首的mp3都拷到手機(jī)里,不過這些mp3都有很多層目錄,而且每首歌曲都還有歌詞文件,我只想留下mp3,歌詞文件都刪掉,就寫了個小程序跑一下,比手動刪快多了
    2012-06-06

最新評論