我正在写两个节目
如果第二个程序没有启动,则不允许用户从第一个程序发送消息。如果用户再次打开第二个程序,则第一个程序需要允许发送消息。如果第一个程序未启动或关闭,则第二个程序也需要自动关闭。
我尝试编写代码,但我无法获得所有方案。在此代码中,我能够发送文本并将文本保存在文件中。在那之后,我无法做到
第一个程序代码在这里:
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();
}
}
}
}
}
第二个程序代码在这里:
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");
}
答案 0 :(得分:1)
我建议第二个程序创建一个名为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
}
第二个程序打开等待句柄并将其状态设置为发出信号:
void InitializeWaitHandle()
{
SendMessageEvent = new EventWaitHandle(false, EventResetMode.ManualReset, WaitHandleName);
SendMessageEvent.Set();
}
当第二个程序关闭时,或者如果您不希望它接收消息时,只需致电Reset
:
SendMessageEvent.Reset();
在两个程序中使用相同名称作为等待句柄。但请使用其他程序不太可能使用的名称。否则你会发生名称冲突。