简单实现进程之间通信

作者:V君 发布于:2014-4-28 12:56 Monday 分类:挖坑经验

由于某些组件很不稳定, 动不动就要让整个程序Crash, 于是开始玩多进程, 让你Crash! 别牵扯主进程 乂D

提到多进程通信, 我相信大家首先想到的就是什么WCF啦管道啦的, 这都比较麻烦啦!

看我怎么简单实现它! 简直无脑 乂D

 

下面有请我们的主角 -- Console !

把组件运行在一个新的进程, 使用标准输入输出和新的进程通信!

 

[

    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;
    jobProcess.ErrorDataReceived += jp_ErrorDataReceived;

    jobProcess.Start();

    jobProcess.BeginErrorReadLine();

    try {
        jobProcess.StandardInput.WriteLine("我的儿呀,帮我去买瓶酱油~");
        var buf = new byte[int.Parse(jobProcess.StandardOutput.ReadLine())];
        jobProcess.StandardOutput.BaseStream.Read(buf0buf.Length);
        return Deserz<Bitmap>(buf);
    }
    finally {
        if (jobProcess.HasExited == false)
            jobProcess.Kill();
    }

]

----

[

    class Program {
        static void Main(string[] args)
        {
            if (args.Length != 0)
            {
                Log.SetLogOutput(Console.Error);
                try                 {
                    var task = Console.ReadLine();
                    var ret = new Worker().DoTask(task);
                    var buf = Serz(ret);
                    Console.WriteLine(buf.Length);
                    System.Threading.Thread.Sleep(100);
                    using (var o = Console.OpenStandardOutput())
                        o.Write(buf0buf.Length);
                }
                catch (Exception ex)
                {
                    Log.E("Err:" + ex.Message);
                }
                finally {
                    Process.GetCurrentProcess().Kill();
                }
                return;
            }
            //... 
        }
    }

]

//哈哈又是压哨博啊, 差点找不到这个月要发布的内容 乂D 


update: 管道的方式似乎在win2008下行不通, 只要开启输入重定向就会无限阻塞... 改用socket或者命名吧...

标签: 软件开发 C# 多进程

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap