Hanging process when run with .NET Process.Start — what's wrong?

后端 未结 5 1016
粉色の甜心
粉色の甜心 2020-12-03 01:25

I wrote a quick and dirty wrapper around svn.exe to retrieve some content and do something with it, but for certain inputs it occasionally and reproducibly hangs and won\'t

相关标签:
5条回答
  • 2020-12-03 01:30

    I know my SVN repos can run slow sometimes, so maybe 5 seconds isn't long enough? Have you copied the string you are passing to the process from a break point so you are positive it's not prompting you for anything?

    0 讨论(0)
  • 2020-12-03 01:34

    I had to drop an exe on a client's machine and use Process.Start to launch it.

    The calling application would hang - the issue ended up being their machine assuming the exe was dangerous and preventing other applications from starting it.

    Right click the exe and go to properties. Hit "Unblock" toward the bottom next to the security warning.

    0 讨论(0)
  • 2020-12-03 01:35

    One standard issue: the process could be waiting for you to read its output. Create a separate thread to read from its standard output while you're waiting for it to exit. It's a bit of a pain, but that may well be the problem.

    0 讨论(0)
  • 2020-12-03 01:43

    I know this is an old post but maybe this will assist someone. I used this to execute some AWS (Amazon Web Services) CLI commands using .Net TPL tasks.

    I did something like this in my command execution which is executed within a .Net TPL Task which is created within my WinForm background worker bgwRun_DoWork method which holding a loop with while(!bgwRun.CancellationPending). This contains the reading of the Standard Output from the Process via a new Thread using the .Net ThreadPool class.

    private void bgwRun_DoWork(object sender, DoWorkEventArgs e)
    {
      while (!bgwRun.CancellationPending)
      {
       //build TPL Tasks
       var tasks = new List<Task>();
    
       //work to add tasks here
    
       tasks.Add(new Task(()=>{
    
         //build .Net ProcessInfo, Process and start Process here
    
         ThreadPool.QueueUserWorkItem(state =>
           {
               while (!process.StandardOutput.EndOfStream)
               {
                   var output = process.StandardOutput.ReadLine();
                   if (!string.IsNullOrEmpty(output))
                   {
                       bgwRun_ProgressChanged(this, new ProgressChangedEventArgs(0, new ExecutionInfo
                       {
                           Type = "ExecutionInfo",
                           Text = output,
                           Configuration = s3SyncConfiguration
                       }));
                   }
    
                   if (cancellationToken.GetValueOrDefault().IsCancellationRequested)
                   {
                         break;
                   }
               }
           });
       });//work Task
    
       //loop through and start tasks here and handle completed tasks
    
      } //end while
    }
    
    0 讨论(0)
  • 2020-12-03 01:52

    Jon Skeet is right on the money!

    If you don't mind polling after you launch your svn command try this:

    Process command = new Process();
    command.EnableRaisingEvents = false;
    command.StartInfo.FileName = "svn.exe";
    command.StartInfo.Arguments = "your svn arguments here";
    command.StartInfo.UseShellExecute = false;
    command.StartInfo.RedirectStandardOutput = true;
    command.Start();
    
    while (!command.StandardOutput.EndOfStream)
    {
        Console.WriteLine(command.StandardOutput.ReadLine());
    }
    
    0 讨论(0)
提交回复
热议问题