语言类型:C#
使用场景:需要使不同进程间可以进行通信
关键代码:
#region Pipe
/// <summary> G/S:管道接收端 </summary>
private NamedPipeServerStream PipeReceiver { get; set; }
/// <summary> G/S:管道接收事件 </summary>
private Action<string> OnPipeReceived { get; set; }
/// <summary>
/// Void:初始化管道接收端
/// </summary>
/// <param name="pipeName">管道名称</param>
public void InitReceiver(string pipeName)
{
this.PipeReceiver = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
this.PipeReceiver.BeginWaitForConnection(this._OnPipeCallback, this.PipeReceiver);
}
/// <summary>
/// Void:管道回调函数
/// </summary>
/// <param name="ar">回调结果</param>
private void _OnPipeCallback(IAsyncResult ar)
{
var _pipe = (NamedPipeServerStream)ar.AsyncState;
_pipe.EndWaitForConnection(ar);
var data = new byte[1024];
var count = _pipe.Read(data, 0, 1024);
if (count > 0)
{
string _message = Encoding.UTF8.GetString(data, 0, count);
this.OnPipeReceived?.Invoke(_message);
}
_pipe.Disconnect();//一定要断开链接
_pipe.BeginWaitForConnection(this._OnPipeCallback, _pipe);
}
/// <summary>
/// Void:发送信息到指定管道
/// </summary>
/// <param name="pipeName">管道名称</param>
/// <param name="msg">发送的信息</param>
public void Send(string pipeName, string msg)
{
using (var _pipeSender = new NamedPipeClientStream(pipeName))
{
_pipeSender.Connect(5000);
var _bytes = Encoding.UTF8.GetBytes(msg);
if (_pipeSender.CanWrite)
{
_pipeSender.Write(_bytes, 0, _bytes.Length);
_pipeSender.Flush();
_pipeSender.Close();
}
}
}
#endregion