我想在父进程和子进程之间创建通信,两者均使用C#编写。
它应该是异步的,事件驱动的。
我不想在每个进程中运行一个线程来处理非常罕见的通信。
最好的解决方案是什么?
我想在父进程和子进程之间创建通信,两者均使用C#编写。
它应该是异步的,事件驱动的。
我不想在每个进程中运行一个线程来处理非常罕见的通信。
最好的解决方案是什么?
Answers:
如果您的进程在同一台计算机上,则只需使用stdio即可。
这是我的用法,一个网页屏幕截图:
var jobProcess = new Process();
jobProcess.StartInfo.FileName = Assembly.GetExecutingAssembly().Location;
jobProcess.StartInfo.Arguments = "job";
jobProcess.StartInfo.CreateNoWindow = false;
jobProcess.StartInfo.UseShellExecute = false;
jobProcess.StartInfo.RedirectStandardInput = true;
jobProcess.StartInfo.RedirectStandardOutput = true;
jobProcess.StartInfo.RedirectStandardError = true;
// Just Console.WriteLine it.
jobProcess.ErrorDataReceived += jp_ErrorDataReceived;
jobProcess.Start();
jobProcess.BeginErrorReadLine();
try
{
jobProcess.StandardInput.WriteLine(url);
var buf = new byte[int.Parse(jobProcess.StandardOutput.ReadLine())];
jobProcess.StandardOutput.BaseStream.Read(buf, 0, buf.Length);
return Deserz<Bitmap>(buf);
}
finally
{
if (jobProcess.HasExited == false)
jobProcess.Kill();
}
在Main上检测args
static void Main(string[] args)
{
if (args.Length == 1 && args[0]=="job")
{
//because stdout has been used by send back, our logs should put to stderr
Log.SetLogOutput(Console.Error);
try
{
var url = Console.ReadLine();
var bmp = new WebPageShooterCr().Shoot(url);
var buf = Serz(bmp);
Console.WriteLine(buf.Length);
System.Threading.Thread.Sleep(100);
using (var o = Console.OpenStandardOutput())
o.Write(buf, 0, buf.Length);
}
catch (Exception ex)
{
Log.E("Err:" + ex.Message);
}
}
//...
}
ProcessStartInfo.UseShellExecute
is),则将无法工作true
。在这种情况下,您将无法重定向标准输出和错误。
我建议使用Windows Communication Foundation:
http://en.wikipedia.org/wiki/Windows_Communication_Foundation
您可以来回传递对象,使用各种不同的协议。我建议使用二进制tcp协议。
还有MSMQ(Microsoft消息队列),它可以跨网络以及在本地计算机上运行。尽管有更好的通信方式,但值得研究:https : //msdn.microsoft.com/zh-cn/library/ms711472(v=vs.85).aspx
当不考虑安全性且受您的限制(同一台计算机上有两个C#进程)时,C#中用于进程间通信的最简单解决方案是Remoting API。现在,Remoting是一项遗留技术(与已弃用的技术不同),不鼓励在新项目中使用,但它确实能很好地工作,并且不需要很多浮躁和环境来工作。
在MSDN上IpcChannel
有一篇很棒的文章,它使用Remoting框架中的类(在这里可以找到Greg Beech的信用)来建立简单的远程服务器和客户端。
我建议先尝试这种方法,然后再尝试将代码移植到WCF(Windows Communication Framework)。具有多个优点(更好的安全性,跨平台),但必定更复杂。幸运的是,MSDN上有一篇很好的文章,将代码从Remoting移植到WCF。
如果您想立即使用WCF进行学习,这里有一个很棒的教程。