Envoi de message à partir d'une application console C# à l'autre

Tout d'abord, j'ai lu tous les sujets liés et ils ont donné une idée générale mais l'application ne fonctionne pas pour moi:

Envoyer des chaînes à partir d'une application de console à l'autre

Comment envoyer de l'entrée à la console comme si l'utilisateur tape?

Envoi d'entrée/sortie à partir d'une application console C#/WinForms)

J'ai une application console qui est en train de faire certaines actions en arrière-plan jusqu'à ce que l'annulation est demandée. Scénario d'utilisation habituelle est :

1) Exécuter l'application

2) Saisissez les données d'entrée

3) Problème de la commande de démarrage

4) Après un certain temps passe, entrez la commande stop

5) Quitter l'application

Demande pour un enfant 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();
}

Ce que je cherche est une sorte de l'hôte de l'utilitaire de contrôle de cette application engendrer de multiples instances et effectuer les nécessaires actions de l'utilisateur sur chaque instance.
Application hôte Program.cs :

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

Quand je lance cet outil, après la première entrée, il se bloque avec "a cessé de fonctionner" erreur et invite à envoyer vidage de la mémoire à Microsoft. De la fenêtre de sortie VS, ne montre aucun exceptions.

Devinez ce problème se produit quelque part entre les applications et peut-être en raison de flux de sortie dépassement de la mémoire tampon (enfant app est écrit beaucoup d'étoiles à chaque seconde qui imite la production réelle qui peut être énorme) et j'ai encore aucune idée de comment le résoudre. Je n'ai pas vraiment besoin de passer de l'enfant à la sortie de l'hôte (seulement envoyer des start-stop commandes à l'enfant), mais en commentant RedirectStandardOutput et OutputDataReceived ne résout pas ce problème. Toutes les idées sur la façon de faire ce travail?

Pourquoi pas à l'aide de l'IPC et de la Pipe? Il est très facile, si vous souhaitez travailler sur un seul client ou à l'intérieur d'un réseau local. WCF est une autre option.
J'ai besoin de littéralement passer 3 cordes d'une application à une autre. En essayant de garder les choses aussi simples que possible.
Il y a en général pas beaucoup de point de départ de nombreux processus pour effectuer une tâche. Vous aurez accomplir exactement la même chose en commençant par de nombreux fils. De nombreux avantages, y compris l'obtention de beaucoup mieux diagnostics quand quelque chose va mal.
Ne fait aucune différence ce que vous voulez communiquer. Lectures recommandées: msdn.microsoft.com/en-us/library/bb546085.aspx et stackoverflow.com/questions/13806153/example-of-named-pipes
Ainsi, chaque enfant a des problèmes d'application de près de 1000 demandes de service (20 simultanée en moyenne) par minute et la consommation de mémoire est un problème (dépassement de mémoire). Pas beaucoup de place pour l'optimisation en tenant compte du fait standard de la WCF et SoapHttpClientProtocol wrappers sont utilisés.

OriginalL'auteur Jaded | 2013-09-11