Processus.Début bloque
Je suis du Processus appelant.Démarrer, mais elle bloque le thread courant.
pInfo = new ProcessStartInfo("C:\\Windows\\notepad.exe");
//Start process
mProcess = new Process();
mProcess.StartInfo = pInfo;
if (mProcess.Start() == false) {
Trace.TraceError("Unable to run process {0}.");
}
Même lorsque le processus est fermé, le code ne répond plus.
Mais Processus.Commencer est vraiment censé bloquer? Ce qui se passe?
(Le processus démarre pas correctement)
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
namespace Test
{
class Test
{
[STAThread]
public static void Main()
{
Thread ServerThread = new Thread(AccepterThread);
ServerThread.Start();
Console.WriteLine (" --- Press ENTER to stop service ---");
while (Console.Read() < 0) { Application.DoEvents(); }
Console.WriteLine("Done.");
}
public static void AccepterThread(object data)
{
bool accepted = false;
while (true) {
if (accepted == false) {
Thread hThread = new Thread(HandlerThread);
accepted = true;
hThread.Start();
} else
Thread.Sleep(100);
}
}
public static void HandlerThread(object data)
{
ProcessStartInfo pInfo = new ProcessStartInfo("C:\\Windows\\notepad.exe");
Console.WriteLine("Starting process.");
//Start process
Process mProcess = new Process();
mProcess.StartInfo = pInfo;
if (mProcess.Start() == false) {
Console.WriteLine("Unable to run process.");
}
Console.WriteLine("Still living...");
}
}
}
Sortie de la Console est:
--- Appuyez sur ENTRÉE pour arrêter le service ---
Départ du processus.
Trouvé:
[STAThread]
Rend le Processus.Commencer à bloquer. J'ai lu STAThread et le Multithreading, mais je ne peut pas lier les concepts et le Processus.Comportement de démarrage.
Autant que je sache, STAThread est nécessaire par Windows.Forme. Comment contourner ce problème lors de l'utilisation de Windows.Formulaire?
Nouvelles pour l'enfer:
Si je reconstruire ma demande, le première fois que je lance l'application fonctionne correctement, mais si j'arrête de débogage et de redémarrer iy encore une fois, le problème relever.
Le problème ne se pose pas lorsque l'application est exécutée sans le débogueur.
UseShellExecute
et ErrorDialog
de vrai et de voir si il y a des erreurs générées.Bien, étant donné que nous ne savons pas ce que le "cDaemon" la classe, c'est un peu dur de dire ce qui se passe. S'il vous plaît essayez de venir avec une courte mais programme qui illustre le problème.
(Utilisation de l'Application.DoEvents combiné avec la Console.Lire semble assez suspect.)
Skeet Ici, c'est le travail. " mProcess.Démarrer' blocs, même si a commencé le processus a été fermé.
J'ai une application WinForms qui appelle
Process.Start
sans blocage.
OriginalL'auteur Luca | 2010-06-19
Vous devez vous connecter pour publier un commentaire.
Non,
Process.Start
ne pas attendre pour le processus de l'enfant à compléter... sinon vous ne seriez pas en mesure d'utiliser les fonctions redirigé I/O.Console exemple d'application:
Ce estampes "Voir, je suis toujours en cours" sans problème sur ma boîte - qu'est-il en train de faire sur votre boîte?
Processus de Démarrage s'affiche à bloquer le thread principal pour moi
Il n'a vraiment pas l'habitude. Je vous suggère de vous poser une nouvelle question avec une courte mais complète exemple.
J'ai posté une nouvelle question concernant. Un aspect unique est je l'affichage d'un formulaire avant de l'App.Exécutez stackoverflow.com/questions/33466758/...
Un comportement très étrange, j'ai été en mesure de résoudre par le lancement du processus de démarrage dans son propre thread. J'avais essayé les deux, à l'aide des retards de temps sur le processus de démarrage et de lancement du processus, le traitement n'événements, etc. Le processus de lancement est exécuté à l'intérieur d'un C# script de l'application NinjaTrader fyi.
OriginalL'auteur Jon Skeet
Créer un ProcessStartInfo et définir UseShellExecute à false (valeur par défaut est true). Votre code doit lire:
J'ai eu le même problème et de lancer le fichier exécutable de la création du processus directement à partir du fichier exécutable a résolu le problème.
J'ai essayé de résoudre ce problème pour les jours, merci
OriginalL'auteur Yves Tkaczyk
J'éprouvais le même comportement de blocage que l'original de l'affiche dans une application WinForms, j'ai donc créé l'application console ci-dessous pour simplifier les tests de ce comportement.
Jon Skeet l'exemple utilise le bloc-notes, qui ne prend que quelques millisecondes pour charger normalement, si un thread bloc peut passer inaperçue. J'ai essayé de lancer Excel qui prend généralement plus de temps.
Appels à la fois
StartWithPath
etStartWithInfo
bloquer mon thread dans une application console. Ma console n'affiche pas "le Processus de la Route" jusqu'à ce que après le Excel écran de démarrage se ferme et la fenêtre principale est ouverte.StartInNewThread
affichera les messages sur la console immédiatement, tandis que l'écran de démarrage pour Excel est toujours ouverte.OriginalL'auteur JamesFaix
Nous avons eu ce problème lors du lancement d'une .chauve-souris script qui a été sur un lecteur réseau sur un autre domaine (nous avons une double confiance des domaines). J'ai couru une distance C# débogueur et bien sûr le Processus.Start() était de bloquer indéfiniment.
Lors de la répétition de cette tâche de manière interactive en power shell, une boîte de dialogue de sécurité a été popping up:
Autant qu'une solution, c'est la direction nous sommes allés. La personne qui a fait le travail modifié de domaine objet de stratégie de groupe pour accomplir la confiance.
OriginalL'auteur crokusek