/// <summary>コンストラクタ</summary> /// <param name="dstEventClass">送信先イベント区分</param> /// <param name="dstFuncID">送信先機能ID(最大36文字)</param> /// <param name="srcEventClass">送信元イベント区分</param> /// <param name="srcFuncID">送信元機能ID(最大36文字)</param> /// <param name="srcPipeName">送信元 名前付きパイプ名(最大36文字)</param> /// <param name="dataLength">データ部のバイト長</param> public AsyncEventHeader( AsyncEventEnum.EventClass dstEventClass, string dstFuncID, AsyncEventEnum.EventClass srcEventClass, string srcFuncID, string srcPipeName, uint dataLength) { // 送信先イベント区分 this.DstEventClass = (int)dstEventClass; // 送信先機能ID this.DstFuncID = new char[36]; this.DstFuncID = dstFuncID.PadRight(36,' ').ToCharArray(0, 36); // 送信元イベント区分 this.SrcEventClass = (int)srcEventClass; // 送信元機能ID this.SrcFuncID = new char[36]; this.SrcFuncID = srcFuncID.PadRight(36, ' ').ToCharArray(0, 36); // 送信元 名前付きパイプ名 this.SrcPipeName = new char[36]; this.SrcPipeName = srcPipeName.PadRight(36, ' ').ToCharArray(0, 36); // データ部のバイト長 this.DataLength = dataLength; }
/// <summary>非同期イベント通知</summary> /// <param name="dstEventClass">送信先イベント区分(最大36文字)</param> /// <param name="dstFuncID">送信先機能ID(最大36文字)</param> /// <param name="srcEventClass">送信元イベント区分(最大36文字)</param> /// <param name="srcFuncID">送信元機能ID(最大36文字)</param> /// <param name="dstPipeName">送信先 名前付きパイプ名</param> /// <param name="srcPipeName">送信元 名前付きパイプ名</param> /// <param name="dataLength">データ部のバイト長</param> /// <param name="bodyBytes">データ部のバイト表現</param> /// <returns> /// ・成功:true /// ・失敗:false(名前付きパイプ クライアントが見つからない) /// </returns> /// <remarks>スレッド セーフ</remarks> public static bool SendAsyncEvent( AsyncEventEnum.EventClass dstEventClass, string dstFuncID, AsyncEventEnum.EventClass srcEventClass, string srcFuncID, string dstPipeName, string srcPipeName, uint dataLength, byte[] bodyBytes) { lock (AsyncEventFx._lock) // staticなのでロックする。 { if (AsyncEventFx.NPCS.ContainsKey(dstPipeName)) { // 名前付きパイプ クライアントを取得 NamedPipeClient npc = AsyncEventFx.NPCS[dstPipeName]; // ヘッダ部のバイト表現を生成 // ヘッダ部を生成 AsyncEventHeader aeh = new AsyncEventHeader( dstEventClass, dstFuncID, srcEventClass, srcFuncID, srcPipeName, dataLength); // ヘッダ部のマーシャリング byte[] headerBytes = CustomMarshaler.StructureToBytes(aeh); // ヘッダ・データ部のバイト表現をマージ byte[] bytes = new byte[headerBytes.Length + bodyBytes.Length]; Array.Copy(headerBytes, bytes, headerBytes.Length); Array.Copy(bodyBytes, 0, bytes, headerBytes.Length, bodyBytes.Length); // Threadを生成してThread関数(SendData)を実行 Thread th = new Thread(npc.SendData); th.Start(bytes); return true; } else { return false; } } }