程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#共享內存實例

C#共享內存實例

編輯:關於C#

網上有C#共享內存類,不過功能太簡單了,並且寫內存每次都從開頭寫。故對此進行了改進,並做了個小例子,供需要的人參考。

主要改進點:

通過利用共享內存的一部分空間(以下稱為“數據信息區”)來存儲當前內存中存儲的數據信息(count和length或者添加其他信息),完成了對內存讀寫功能的完善。

在讀寫內存時,讀寫數據信息區。

1.寫共享內存

根據共享內存當前的使用length,依次往後寫。

2.讀共享內存

讀取從共享內存的起始位置(不包括數據信息區)至length的所有數據。

3.關鍵點

把IntPtr型的m_pwData當指針來操作,實現從內存的任意位置讀寫數據。

m_pwDataWrite = (IntPtr)(m_pwData.GetHashCode() + m_length + infoSize);

4.可改進處

在數據信息區,添加每條數據的length信息,即可實現自由讀取數據,而不必每次都起始讀。

實例截圖如下:

讀數據信息:

public int ReadLengthAndCount()
{
Byte[] bytData = new Byte[infoSize];
if (infoSize > m_MemSize) return 2; //超出數據區
if (m_bInit)
{
Marshal.Copy(m_pwData, bytData, 0, infoSize);
}
else
{
return 1; //共享內存未初始化
}
String str = System.Text.Encoding.Unicode.GetString(bytData).Trim('');
String [] strs = System.Text.RegularExpressions.Regex.Split(str,"");
m_length = System.Convert.ToInt32(strs[0]);
m_count = System.Convert.ToInt32(strs[1]);
return 0; //讀成功
}

寫數據信息:

public int WriteLengthAndCount(int length, int count)
{
semWriteLength.WaitOne();
if (infoSize > m_MemSize) return 2; //超出數據區
String strLengthAndCount = System.Convert.ToString(length) + "" + System.Convert.ToString(count);
Byte[] bytData = System.Text.Encoding.Unicode.GetBytes(strLengthAndCount);
if (m_bInit)
{
Marshal.Copy(bytData, 0, m_pwData, bytData.Length);
}
else
{
semWriteLength.Release();
return 1; //共享內存未初始化
}
semWriteLength.Release();
return 0;
}

源碼(工程文件)下載地址:

http://download.csdn.net/source/798731

本工程在以下環境下編譯通過:

Windows XP SP3

Microsoft VisualC# 2005

Microsoft VisualStudio 2005 V8.0.50727.42

Microsoft .NET Framework V2.0.50727

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved