it-swarm-eu.dev

Was ist die einfachste Methode der Kommunikation zwischen Prozessen zwischen 2 C # -Prozessen?

Ich möchte zwischen einem übergeordneten und einem untergeordneten Prozess kommunizieren, die beide in C # geschrieben sind. Es sollte asynchron und ereignisgesteuert sein. Ich möchte nicht in jedem Prozess einen Thread ausführen, der die sehr seltene Kommunikation handhabt.

Was ist die beste Lösung dafür?

48
Horcrux7

Anonyme Pfeifen.

http://msdn.Microsoft.com/de-de/library/bb546102.aspx

Verwenden Sie asynchrone Operationen mit BeginRead/BeginWrite und AsyncCallback.

32

Wenn sich Ihre Prozesse auf demselben Computer befinden, können Sie einfach stdio verwenden.

Dies ist meine Verwendung, ein Screenshooter für eine Webseite:

        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();
        }

Args am Main erkennen

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);
        }
    }
    //...
}
13
IlPADlI

Ich würde vorschlagen, die Windows Communication Foundation zu verwenden:

http://en.wikipedia.org/wiki/Windows_Communication_Foundation

Sie können Objekte hin und her übergeben und verschiedene Protokolle verwenden. Ich würde vorschlagen, das binäre TCP-Protokoll zu verwenden.

8
bobwienholt
5
Amy B

Es gibt auch MSMQ (Microsoft Message Queuing), das sowohl in Netzwerken als auch auf einem lokalen Computer ausgeführt werden kann. Obwohl es bessere Kommunikationsmöglichkeiten gibt, ist es ratsam, nachzusehen: https://msdn.Microsoft.com/en-us/library/ms711472(v=vs.85).aspx

1
Rowan

Es gibt auch COM .

Es gibt technische Aspekte, aber ich würde sagen, der Vorteil ist, dass Sie Methoden aufrufen können, die Sie definieren können.

MSDN bietet C # COM-Interop-Lernprogramme. Bitte suchen Sie, da sich diese Links ändern.

Um sofort loszulegen, gehe hier ...

1
Kay Zed

Die easiest - Lösung in C # für die Kommunikation zwischen Prozessen, wenn Sicherheit keine Rolle spielt und angesichts Ihrer Einschränkungen (zwei C # -Prozesse auf demselben Computer) die Remoting-API ist. Jetzt ist Remoting eine alte Technologie (nicht gleich veraltet) und wird nicht für die Verwendung in neuen Projekten empfohlen, sie funktioniert jedoch gut und erfordert nicht viel Pomp und Umstände, um arbeiten zu können. 

Auf MSDN gibt es einen ausgezeichneten Artikel für die Verwendung der Klasse IpcChannel aus dem Remoting-Framework (Kredit an Greg Beech für das Finden hier ) zum Einrichten eines einfachen Remoting-Servers und -Clients.

Ich würde vorschlagen, zuerst diesen Ansatz zu versuchen und dann zu versuchen, Ihren Code auf WCF (Windows Communication Framework) zu portieren. Dies hat mehrere Vorteile (bessere Sicherheit, plattformübergreifend), ist jedoch notwendigerweise komplexer. Glücklicherweise hat MSDN einen sehr guten Artikel für die Portierung von Code von Remoting nach WCF .

Wenn Sie mit WCF gleich eintauchen möchten, finden Sie hier ein tolles Tutorial .

0
cdiggins