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?
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
Vous devez vous connecter pour publier un commentaire.
Je vous conseille d'utiliser
NamedPipeServerStream
etNamedPipeClientStream
, ce qui vous permet d'ouvrir un flux qui permettra la communication entre processus sur une machine donnée.Tout d'abord, cela permettra de créer un tuyau de flux de serveur et d'attendre que quelqu'un s'y connecter:
Ensuite, cela se connecter à ce flux (à partir de votre autre processus), vous permettant de lire /écrire dans les deux sens:
OriginalL'auteur Jon G
Une autre alternative est d'utiliser le service MSMQ, vous pouvez trouver un bon tutoriel ici
OriginalL'auteur user65439
Je vous conseille de regarder l' de Travail avec les fichiers mappés en mémoire .NET 4
http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx
C'est rapide et efficace.
OriginalL'auteur J. van Langen