آشنایی با Pipe در #C

در این مقاله اطلاعات پایه در مورد Pipe و نحوه کار آن را شرح می دهیم

آشنایی با Pipe در #C

بسیاری از برنامه نویسان مشکل کار و انتقال حجم زیادی از اطلاعات از یک قسمت به قسمتی دیگر دارند .فرایند انتقال اطلاعات ممکن است بیش از آن چیزی که انتظار داریم طول بکشد و این امر سبب نارضایتی کاربر در استفاده از نرم افزار میشود .برای رفع این مشکل باید فرمت اطلاعات را تغییر دهیم که این فرایند نیز طولانی است , نهایتا اگر از 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);  
    }  
}

 

فایل های ضمیمه