0

私は2つのプログラムを書いています

  • 最初のプログラムは、テキスト メッセージを 2 番目のプログラムに送信します。
  • 2 番目のプログラムは、すべてのメッセージを指定されたファイルに書き込みます。2 番目のプログラムが終了したら、最初のプログラムに閉じるか終了することを通知する必要があります。

2 番目のプログラムが起動していない場合、ユーザーは最初のプログラムからメッセージを送信できません。ユーザーが 2 番目のプログラムを再度開いた場合、最初のプログラムはメッセージの送信を許可する必要があります。最初のプログラムが起動または終了していない場合、2 番目のプログラムも自動的に終了する必要があります。

コードを書き込もうとしましたが、すべてのシナリオを取得できません。このコードでは、テキストを送信し、テキストをファイルに保存できます。その後、私はできません

最初のプログラムコードはここにあります:

public void ThreadStartClient(object obj)
{

        ManualResetEvent syncServer = (ManualResetEvent)obj;

        using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("PipeTo"))
        {

            pipeStream.Connect();
            Console.WriteLine("[First program] Pipe Connection established");
            using (StreamWriter sw = new StreamWriter(pipeStream))
            {
                sw.AutoFlush = true;
                string message;
                Console.WriteLine("Please type a message and press [ENTER], or type 'quit' to exit the program");
                while ((message = Console.ReadLine()) != null)
                {
                    if (message == "quit")
                    {
                        break;
                    }
                    try
                    {
                        sw.WriteLine(message);
                    }
                    catch (Exception ex)
                    {
                       // pipeStream.Connect();
                    }
                }
            }
        }
    }

2 番目のプログラム コードは次のとおりです。

 public void ThreadStartServer()
    {
        using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("PipeTo"))
        {
            Console.WriteLine("[Second program] Pipe Created");
            pipeStream.WaitForConnection();
            Console.WriteLine("[Second program] Pipe connection established");
            StreamWriter sw1 = new StreamWriter("C:\\ServerEXE\\DemoTest.txt", true);


            using (StreamReader sr = new StreamReader(pipeStream))
            {
                string message;
                while ((message = sr.ReadLine()) != null)
                {
                    sw1.WriteLine(message);
                    sw1.Flush();
                    Console.WriteLine("{0}", message);
                }
            }
        }
        Console.WriteLine("Connection lost");
    }
4

1 に答える 1

1

2 番目のプログラムで名前付きのEventWaitHandleを作成し、その状態をシグナル状態に設定することをお勧めします。最初のプログラムは、イベントが通知されているかどうかをテストできます。そうであれば、メッセージを送信できます。

最初のプログラムでは、次のように記述します。

private EventWaitHandle SendMessageEvent;
private const string WaitHandleName = "UniqueNameForThisHandle";

void InitializeWaitHandle()
{
    SendMessageEvent = new EventWaitHandle(false, EventResetMode.ManualReset, WaitHandleName);
}

メッセージを送信するには、まず待機ハンドルを確認します。

if (SendMessageEvent.WaitOne(0))
{
    // event is signaled, so send the message
}

2 番目のプログラムは、待機ハンドルを開き、その状態をシグナル状態に設定します。

void InitializeWaitHandle()
{
    SendMessageEvent = new EventWaitHandle(false, EventResetMode.ManualReset, WaitHandleName);
    SendMessageEvent.Set();
}

2 番目のプログラムがシャットダウンしたとき、またはメッセージを受信したくない場合は、次のように呼び出しますReset

SendMessageEvent.Reset();

両方のプログラムで待機ハンドルに同じ名前を使用します。ただし、他のプログラムで使用される可能性が低い名前を使用してください。そうしないと、名前の衝突が発生します。

于 2013-05-28T17:01:57.287 に答える