从一个C#控制台应用程序向另一个C#控制台应用程序发送消息
首先,我已经阅读了所有相关主题,他们给出了总体思路,但实现对我来说不起作用:从一个C#控制台应用程序向另一个C#控制台应用程序发送消息,c#,process,console,interop,message,C#,Process,Console,Interop,Message,首先,我已经阅读了所有相关主题,他们给出了总体思路,但实现对我来说不起作用: 我有一个控制台应用程序,它在后台执行一些操作,直到请求取消。典型的使用场景是: 1) 执行应用程序 2) 输入输入数据 3) 发出启动命令 4) 经过一段时间后,输入stop命令 5) 退出应用程序 子应用程序Program.cs: static void Main() { Console.WriteLine("Enter input parameter : "); var inputParame
我有一个控制台应用程序,它在后台执行一些操作,直到请求取消。典型的使用场景是:
1) 执行应用程序
2) 输入输入数据
3) 发出启动命令
4) 经过一段时间后,输入stop命令
5) 退出应用程序
子应用程序
Program.cs
:static void Main()
{
Console.WriteLine("Enter input parameter : ");
var inputParameter = Console.ReadLine();
Console.WriteLine("Entered : " + inputParameter);
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task.Factory.StartNew(() =>
{
while (true)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Stopping actions");
return;
}
// Simulating some actions
Console.Write("*");
}
}, token);
if (Console.ReadKey().KeyChar == 'c')
{
tokenSource.Cancel();
Console.WriteLine("Stop command");
}
Console.WriteLine("Finished");
Console.ReadLine();
}
static void Main()
{
const string exe = "Child.exe";
var exePath = System.IO.Path.GetFullPath(exe);
var startInfo = new ProcessStartInfo(exePath)
{
RedirectStandardOutput = true,
RedirectStandardInput = true,
WindowStyle = ProcessWindowStyle.Hidden,
WindowStyle = ProcessWindowStyle.Maximized,
CreateNoWindow = true,
UseShellExecute = false
};
var childProcess = new Process { StartInfo = startInfo };
childProcess.OutputDataReceived += readProcess_OutputDataReceived;
childProcess.Start();
childProcess.BeginOutputReadLine();
Console.WriteLine("Waiting 5s for child process to start...");
Thread.Sleep(5000);
Console.WriteLine("Enter input");
var msg = Console.ReadLine();
// Sending input parameter
childProcess.StandardInput.WriteLine(msg);
// Sending start command aka any key
childProcess.StandardInput.Write("s");
// Wait 5s while child application is working
Thread.Sleep(5000);
// Issue stop command
childProcess.StandardInput.Write("c");
// Wait for child application to stop
Thread.Sleep(20000);
childProcess.WaitForExit();
Console.WriteLine("Batch finished");
Console.ReadLine();
}
我要寻找的是某种主机实用程序来控制这个应用程序——生成多个实例并在每个实例上执行所需的用户操作。
主机应用程序Program.cs
:static void Main()
{
Console.WriteLine("Enter input parameter : ");
var inputParameter = Console.ReadLine();
Console.WriteLine("Entered : " + inputParameter);
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task.Factory.StartNew(() =>
{
while (true)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Stopping actions");
return;
}
// Simulating some actions
Console.Write("*");
}
}, token);
if (Console.ReadKey().KeyChar == 'c')
{
tokenSource.Cancel();
Console.WriteLine("Stop command");
}
Console.WriteLine("Finished");
Console.ReadLine();
}
static void Main()
{
const string exe = "Child.exe";
var exePath = System.IO.Path.GetFullPath(exe);
var startInfo = new ProcessStartInfo(exePath)
{
RedirectStandardOutput = true,
RedirectStandardInput = true,
WindowStyle = ProcessWindowStyle.Hidden,
WindowStyle = ProcessWindowStyle.Maximized,
CreateNoWindow = true,
UseShellExecute = false
};
var childProcess = new Process { StartInfo = startInfo };
childProcess.OutputDataReceived += readProcess_OutputDataReceived;
childProcess.Start();
childProcess.BeginOutputReadLine();
Console.WriteLine("Waiting 5s for child process to start...");
Thread.Sleep(5000);
Console.WriteLine("Enter input");
var msg = Console.ReadLine();
// Sending input parameter
childProcess.StandardInput.WriteLine(msg);
// Sending start command aka any key
childProcess.StandardInput.Write("s");
// Wait 5s while child application is working
Thread.Sleep(5000);
// Issue stop command
childProcess.StandardInput.Write("c");
// Wait for child application to stop
Thread.Sleep(20000);
childProcess.WaitForExit();
Console.WriteLine("Batch finished");
Console.ReadLine();
}
当我运行此工具时,在第一次输入后,它会崩溃,出现“已停止工作”错误,并提示向Microsoft发送内存转储。VS中的输出窗口不显示任何异常。我猜这个问题发生在应用程序之间的某个地方,可能是因为输出流缓冲区溢出(子应用程序每秒都会写很多星星,这模仿了可能非常巨大的真实输出),但我还不知道如何修复它。我真的不需要将孩子的输出传递给主机(只向孩子发送开始-停止命令),但注释RedirectStandardOutput和OutputDataReceived并不能解决这个问题。有什么办法可以实现这一点吗?我建议使用
NamedPipeServerStream
和NamedPipeClientStream
,它允许您打开一个流,在给定机器上的进程之间进行通信
首先,这将创建一个管道服务器流,并等待有人连接到它:
var stream = new NamedPipeServerStream(this.PipeName, PipeDirection.InOut);
stream.WaitForConnection();
return stream;
然后,这将连接到该流(来自您的另一个进程),允许您在任意方向读/写:
var stream = new NamedPipeClientStream(".", this.PipeName, PipeDirection.InOut);
stream.Connect(100);
return stream;
另一种选择是使用MSMQ,您可以找到一个很好的教程我建议您在.NET 4中查看如何使用内存映射文件
它快速高效。为什么不使用IPC和管道?如果您想在单个客户机上或局域网内工作,这是非常容易的。WCF是另一个选项。我需要将3个字符串从一个应用程序传递到另一个应用程序。尽量使事情尽可能简单。通常来说,启动许多流程来完成工作没有多大意义。通过启动多个线程,您将完成完全相同的任务。许多优点,包括在出现问题时获得更好的诊断。无论你想要传达什么都没有区别。推荐阅读:和@HansPassant嗯,每个子应用程序每分钟发出大约1000个服务请求(平均同时发出20个),内存消耗是一个问题(OutOfMemory)。考虑到使用了标准WCF和SoapHttpClientProtocol包装器,没有太多的优化空间。