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

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

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

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

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

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

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

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

  將自定義的數(shù)據(jù)放置到剪切板,自定義一個(gè)圖片類,并標(biāo)記為可序列化(此處使用的命名空間是:TestClipboard)。將自定義數(shù)據(jù)類型對象放置到剪切板的關(guān)鍵是DataObject類,它實(shí)現(xiàn)了IDataObject接口。它就像一個(gè)容器,存放將被放置在剪切板上的數(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ù)制到剪切板,第二個(gè)參數(shù)表示程序退出時(shí)不清空
  Clipboard.SetDataObject(dataObj, true);
}

  但是,使用Clipboard.SetDataObject方法將一個(gè)DataObject對象放到剪切板后,外界訪問時(shí),需要指定對象的完整類型名稱。如果某種數(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實(shí)現(xiàn)進(jìn)程同步

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

/// <summary>
/// 實(shí)現(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>
/// 實(shí)現(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)可以自動(dòng)啟動(dòng)一系列的處理流程。

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

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

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

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

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

  MemoryMappedViewAccessor 的Write和Read有泛型方法,單類型只能是結(jié)構(gòu)體類型(應(yīng)用類型在程序運(yùn)行時(shí),計(jì)算機(jī)無法知道應(yīng)該向內(nèi)存映射文件寫入多少字節(jié)數(shù)據(jù),引用類型的對象位于托管堆中,其大小需要經(jīng)過計(jì)算,但非常耗時(shí)(而且對象可能引用了其他對象),音效內(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通過管道實(shí)現(xiàn)進(jìn)程通信

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

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

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

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

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

相關(guān)文章

  • C#連接數(shù)據(jù)庫的方法

    C#連接數(shù)據(jù)庫的方法

    ASP.NET連接數(shù)據(jù)庫的技術(shù)叫ADO.NET,它是用來向數(shù)據(jù)庫提交sql語句的一堆類。這里連接的是Sql Server 2008數(shù)據(jù)庫,其他數(shù)據(jù)庫用法差不多,就是調(diào)用的類名不一樣
    2015-11-11
  • 用?FieldMask?提高?C#?gRpc?的服務(wù)性能

    用?FieldMask?提高?C#?gRpc?的服務(wù)性能

    這篇文章主要介紹了用?FieldMask?提高?C#?gRpc?的服務(wù)性能,FieldMask?是一個(gè)?protobuf?消息,包含一個(gè)名為?paths?的字段,用于指定用于指定讀取操作返回或更新操作修改的字,下文詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2022-03-03
  • C#文件加密方法匯總

    C#文件加密方法匯總

    這篇文章主要介紹了C#文件加密方法,實(shí)例匯總了常見的加密方法如AES加密類、文件加密類、文件夾加密類等,最后給出完整的實(shí)例源碼下載供大家參考借鑒,需要的朋友可以參考下
    2014-11-11
  • C#類中屬性與成員變量的使用小結(jié)

    C#類中屬性與成員變量的使用小結(jié)

    本篇文章主要是對C#類中屬性與成員變量的使用進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#實(shí)現(xiàn)漢字轉(zhuǎn)漢語拼音的示例代碼

    C#實(shí)現(xiàn)漢字轉(zhuǎn)漢語拼音的示例代碼

    這篇文章主要介紹了如何利用C#實(shí)現(xiàn)漢字轉(zhuǎn)漢語拼音,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定幫助,感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試
    2022-03-03
  • C#:foreach與yield語句的介紹

    C#:foreach與yield語句的介紹

    C#:foreach與yield語句的介紹,需要的朋友可以參考一下
    2013-03-03
  • C#公眾號(hào)開發(fā)之給用戶發(fā)紅包

    C#公眾號(hào)開發(fā)之給用戶發(fā)紅包

    這篇文章主要為大家詳細(xì)介紹了C#公眾號(hào)開發(fā)之給用戶發(fā)紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • DataReader、DataSet、DataAdapter和DataView使用介紹

    DataReader、DataSet、DataAdapter和DataView使用介紹

    ADO.NET提供兩個(gè)對象用于檢索關(guān)系型數(shù)據(jù)并把它存儲(chǔ)在內(nèi)存中,分別是DataSet和DataReader,本文將詳細(xì)介紹這幾個(gè)對象的應(yīng)用,有需求的朋友可以了解下
    2012-11-11
  • WPF實(shí)現(xiàn)圖片合成或加水印的方法【2種方法】

    WPF實(shí)現(xiàn)圖片合成或加水印的方法【2種方法】

    這篇文章主要介紹了WPF實(shí)現(xiàn)圖片合成或加水印的方法,結(jié)合實(shí)例形式分析了2種比較實(shí)用的WPF圖片操作相關(guān)技巧,需要的朋友可以參考下
    2017-03-03
  • c# 實(shí)現(xiàn)窗體拖到屏幕邊緣自動(dòng)隱藏

    c# 實(shí)現(xiàn)窗體拖到屏幕邊緣自動(dòng)隱藏

    讓窗體拖到屏幕邊緣自動(dòng)隱藏的原理,通過Form1_LocationChanged的方法,當(dāng)窗體位置發(fā)生改變時(shí),判斷其是否在屏幕邊緣,在則隱藏。再通過Timer控件經(jīng)過指定時(shí)間判斷出鼠標(biāo)的位置,若鼠標(biāo)在屏幕左邊、上邊或右邊,這根據(jù)窗體的位置,調(diào)出窗體。
    2009-02-02

最新評論

巴东县| 沅江市| 古田县| 石楼县| 贵州省| 锦屏县| 凤山县| 祥云县| 田林县| 泗洪县| 巴彦县| 柯坪县| 桃园县| 邵阳县| 城步| 华安县| 勃利县| 铜梁县| 凯里市| 淳安县| 南澳县| 惠来县| 句容市| 通江县| 肃南| 龙陵县| 开封县| 泌阳县| 西林县| 肇东市| 侯马市| 金溪县| 石台县| 黄浦区| 德阳市| 安宁市| 天台县| 常山县| 大城县| 浪卡子县| 江门市|