我有一个控制台C#应用程序(本机消息传递应用程序),通过命名管道连接到WinForms。控制台应用程序是与chrome连接的本机消息传递应用程序。WinForm向控制台应用程序发送命令,以开始阅读标准输入流,从而将消息获取到chrome并发送到WinForm。我不知道如何让控制台应用程序保持活动状态,以便它可以等待附加的事件从winform获取命令并读取标准输入流。
这是我的主要职责。
static void Main(string[] args)
{
StartChannel();
}
这是用于从命名管道获取消息的事件处理程序
public void StartChannel()
{
_pipeServer = new PipeServer();
_pipeServer.PipeMessage += new DelegateMessage(PipesMessageHandler);
_pipeServer.Listen(AppConstant.IPC_ConsoleReaderPipe);
}
private void PipesMessageHandler(string message)
{
if(message ="Start")
StartListener();
}
这是我的问题中心。在这里执行StartListener后,控制台应用程序关闭。我如何让它在单独的线程中运行。以便它不会阻塞NamedPipe通信
private static void StartListener()
{
wtoken = new CancellationTokenSource();
readInputStream = Task.Factory.StartNew(() =>
{
wtoken.Token.ThrowIfCancellationRequested();
while (true)
{
if (wtoken.Token.IsCancellationRequested)
{
wtoken.Token.ThrowIfCancellationRequested();
}
else
{
OpenStandardStreamIn();
}
}
}, wtoken.Token);
}
}
public static void OpenStandardStreamIn()
{
Stream stdin = Console.OpenStandardInput();
int length = 0;
byte[] bytes = new byte[4];
stdin.Read(bytes, 0, 4);
length = System.BitConverter.ToInt32(bytes, 0);
string input = "";
for (int i = 0; i < length; i++)
{
input += (char)stdin.ReadByte();
}
Console.Write(input);
}
1条答案
按热度按时间6l7fqoea1#
您应该尝试使用
AutoResetEvent
-请参见http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(v=vs.110).aspx。这样,您的主线程将等待侦听器线程,直到设置事件为止,并且仅在设置事件之后终止。
如果使用的是.NET 4.5,则应使用
async
和await
关键字以及Task.Run()
-〉参见http://msdn.microsoft.com/en-us/library/hh191443.aspx