我想在两个使用C#编写的进程之间建立通信,希望是异步和事件驱动的。
我不想为了处理极少发生的通信情况而在每个进程中运行线程。
哪种方案最佳?
我想在两个使用C#编写的进程之间建立通信,希望是异步和事件驱动的。
我不想为了处理极少发生的通信情况而在每个进程中运行线程。
哪种方案最佳?
如果您的进程在同一台计算机上,您可以简单地使用 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();
}
在主函数中检测参数
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
为 true
,那么这种方法将无法奏效。在这种情况下,您无法重定向标准输出和错误。 - Guido Domenici//out
File.AppendAllText("sharedFile.txt", "payload text here");
// in
File.ReadAllText("sharedFile.txt");
还有 MSMQ(Microsoft Message Queueing),它可以在网络上和本地计算机上运行。虽然有更好的通信方式,但值得研究:https://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx