آشنایی با Pipe در #C
دوشنبه 17 فروردین 1394در این مقاله اطلاعات پایه در مورد Pipe و نحوه کار آن را شرح می دهیم
بسیاری از برنامه نویسان مشکل کار و انتقال حجم زیادی از اطلاعات از یک قسمت به قسمتی دیگر دارند .فرایند انتقال اطلاعات ممکن است بیش از آن چیزی که انتظار داریم طول بکشد و این امر سبب نارضایتی کاربر در استفاده از نرم افزار میشود .برای رفع این مشکل باید فرمت اطلاعات را تغییر دهیم که این فرایند نیز طولانی است , نهایتا اگر از Pipe استفاده کنیم میتوانیم به نتیجه مطلوبی برسیم که هم برای برنامه نویس و هم کاربر رضایت بخش است .
آشنایی با Pipe :
pipe یک طرفه یا دوطرفه که ارتباط بین یک Pipe server و یک یا چند Pipe Client میباشد . تمامی موارد مربوط به Pipe حافظه را برای ارتباط داخلی تقسیم میکند .
نرم افزاری که Pipe را ایجاد میکند Pipe Server است و فرایندی که به Pipe Server متصل میشود Pipe Client نام دارد .
Pipe برای ارتباط بین فرایند در حال انجام بر روی همان کامپیوتر و چندین کامپیوتر که بطور همزمان از یک نرم افزار استفاده می کنند استفاده میشود .
به عنوان مثال ما یک کلاس با نام "employee"داریم و ما میخواهیم Pipe را ایجاد کنیم .در ابتدا اطلاعات از لیست دریافت و به یک pipe دیگر ارسال میشود .
در ادامه به صورت پیش فرض اطلاعاتی را ایجاد میکنیم و سپس این اطلاعات را به فرایند تبدیل ارسال میکنیم .بعد از فرایند کامپیوتر برای این که اطمینان از صحت عملیات انتقال اطلاعات را نمایش میدهیم .
static void Main(string[] args) { ResultData = new List<Client>(); GenerateDefaultData(); Thread resultPipeThread = new Thread(ResultPipe); resultPipeThread.Start(); Thread converterPipeThread = new Thread(() =>ConverterPipe(DefaultData)); converterPipeThread.Start(); resultPipeThread.Join(); if (_converterStream != null) _converterStream.Close(); if (_resultStream != null) _resultStream.Close(); Console.WriteLine("ID\tName\tDefault Phone\tResult Phone"); for (int i = 0; i < 500; i++) { Console.WriteLine(DefaultData[i].Id + "\t" + DefaultData[i].Name + "\t" + DefaultData[i].PhoneNo + "\t" + ResultData[i].PhoneNo); } Console.ReadLine(); }
فرایند تبدیل :
در این فرایند ما اطلاعات را تبدیل میکنیم و سپس این اطلاعات را ارسال میکنیم .
static void ConverterPipe(List<Client> defaultData)
{
_converterStream = new NamedPipeClientStream("MyPipeName");
در کد بالا ما از متد تبدیل یک شئی با نام "NamePipeClientStream" ایجاد می کنیم
_converterStream.Connect();
foreach (var client in defaultData)
{
در قسمت پایین اطلاعات را از طریق دستور foreach اطلاعات موجود در لیست را ارسال میکنیم
//changed client data
Client newClient = new Client() { Name = client.Name, Id = client.Id, PhoneNo = "+91" + client.PhoneNo };
Client messageToSend = newClient;
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(_converterStream, messageToSend);
}
_convertProcessCompleted = true;
}
کد بالا به صورت زیر میباشد :
/// <summary> /// Process default data and send it to pipe. /// </summary> /// <param name="defaultData"></param> static void ConverterPipe(List<Client> defaultData) { _converterStream = new NamedPipeClientStream("MyPipeName"); _converterStream.Connect(); foreach (var client in defaultData) { //changed client data Client newClient = new Client() { Name = client.Name, Id = client.Id, PhoneNo = "+91" + client.PhoneNo }; Client messageToSend = newClient; IFormatter formatter = new BinaryFormatter(); formatter.Serialize(_converterStream, messageToSend); } _convertProcessCompleted = true; }
نتیجه Pipe : همانطور که مشاهده میکنید در ادامه ما اطلاعات را پس از فرایند تبدیل دریافت و ذخیره می کنیم .
/// <summary> /// Create final result from default data. /// </summary> static void ResultPipe() { Console.WriteLine("Waiting for connection on named pipe mypipe"); _resultStream = new NamedPipeServerStream("MyPipeName"); _resultStream.WaitForConnection(); while (_resultProcessCompleted == false) { if (_convertProcessCompleted) { _resultProcessCompleted = true; break; } IFormatter formatter = new BinaryFormatter(); Client clientReceived = (Client)formatter.Deserialize(_resultStream); Thread.Sleep(1); ResultData.Add(clientReceived); } _resultStream.Close(); }
در ادامه برخی متغیر ها , خواص و یک متد ساده برای ساخت اطلاعات پیش فرض استفاده شده است
static NamedPipeClientStream _converterStream; static NamedPipeServerStream _resultStream; static bool _convertProcessCompleted = false; static bool _resultProcessCompleted = false; public static List<Client> DefaultData { get; set; } public static List<Client> ResultData { get; set; } /// <summary> /// Generates default data to transfer. /// </summary> private static void GenerateDefaultData() { DefaultData = new List<Client>(); for (int i = 0; i < 500; i++) { Client client = new Client(); client.Id = i; client.Name = "Client " + i.ToString(); client.PhoneNo = "00111" + i.ToString(); DefaultData.Add(client); } }
- C#.net
- 3k بازدید
- 5 تشکر