Κλήση εκτελέσιμο χρήση της Διαδικασίας διακόπτεται κατά διαστήματα

ψήφοι
2

Ζητώ ένα εκτελέσιμο σε C #. Όταν τρέχει το εκτελέσιμο αρχείο, γράφει από την κονσόλα, ώστε η C # κώδικα είναι να πάρει την έξοδο της κονσόλας και γράφοντας σε ένα αρχείο κειμένου. Όταν η συντριβή συμβεί κάποια πράγματα συμβαίνουν.

1) Η έξοδος του αρχείου κειμένου δεν είναι εντελώς γραμμένο έξω. 2) Το εκτελέσιμο διαδικασία φαίνεται να λειτουργεί πλήρως μέσω επειδή δημιουργεί μια έκθεση σαν μια επιτυχημένη πορεία.

Υποψιάζομαι ότι ο λόγος για αυτή τη σύγκρουση είναι λόγω του τρόπου που γράφω το αρχείο έξω.

Ενημέρωση: - Όσον αφορά τη συντριβή, ένα παράθυρο διαλόγου που δηλώνει ότι η «Διαχειριστής αντιμετώπισε πρόβλημα και πρέπει να τερματιστεί Λυπούμαστε για την ταλαιπωρία.». Στη συνέχεια, θα έχει ένα κουμπί ΟΚ. Όταν κάνετε κλικ στο OK, υπάρχει ένα παράθυρο διαλόγου που έχω setup που σας ρωτά αν θέλετε να ξεκινήσετε πάλι τον διαχειριστή.

  • Η εφαρμογή διαχείρισης που καλεί το εκτελέσιμο είναι μόνο σπείρωμα. Το εκτελέσιμο μπορεί να τρέχει multi-threaded.

Εδώ είναι ένα μικρό απόσπασμα της πρόσκλησης:

  // Set up process to redirect standard output and standard error to
  // a file.
     process.StartInfo.UseShellExecute = false;
     process.StartInfo.RedirectStandardOutput = true;
     process.StartInfo.RedirectStandardError = true;
     FileInfo ofi = new FileInfo(outputPath);
     FileStream ofs = ofi.OpenWrite();
     StreamWriter sw = new StreamWriter(ofs);
     WriteToTextWriterEventHandler wtsweh = new WriteToTextWriterEventHandler(sw);
     DataReceivedEventHandler handler = wtsweh.HandleDataReceived;
     process.OutputDataReceived += handler;
     process.ErrorDataReceived += handler;
     //

     statusAcceptor.ReportStatus(Running process.);
     process.Start();
     process.BeginOutputReadLine();
     process.BeginErrorReadLine();

     statusAcceptor.ReportStatus(Waiting for process to complete.);
     process.WaitForExit();
     int processExitCode = process.ExitCode;
     process.Close();
     sw.Close();


  // 
  private class WriteToTextWriterEventHandler
  {
      private TextWriter tw;

      public WriteToTextWriterEventHandler(TextWriter tw)
      {
          this.tw = tw;
      }

      public void HandleDataReceived(object sendingProcess,
         DataReceivedEventArgs outLine)
      {
          // Collect the sort command output.
          if (!String.IsNullOrEmpty(outLine.Data))
          {
              tw.Write(Environment.NewLine + outLine.Data);
          }
      }
  }
Δημοσιεύθηκε 09/12/2008 στις 20:53
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
1

Είναι ίσως το χειριστές σας. Θα πρέπει να τεθεί σε λογική για να χειριστεί τις εξαιρέσεις που ρίχνονται από τους χειριστές ρεύμα και θα πρέπει να τεθεί σε ένα μηχανισμό για να βεβαιωθείτε ότι οι χειριστές ρεύμα έχουν κλείσει σωστά πριν να καλέσει κοντά στη διαδικασία. Προβλήματα όπως αυτό είναι δύσκολο να γίνουν αντιληπτά, επειδή τα ζητήματα συγχρονισμού με τις χειρισμού συμβάντων και την process.close, ώστε να μην μου εκπλήξει άλλες αφίσες δεν ήταν σε θέση να το αναπαράγουν. Αλλά έχω δει σε δράση. Το πρόβλημα είναι η EventHandler είναι ενεργή μέχρι να κλείσει καλώντας cancelErrorRead ή cancelOutputRead ή τις εξόδους της διαδικασίας. Λοιπόν, αν εξακολουθεί να είναι απασχολημένο έξαψη κάποια έξοδο από το τέλος της διαδικασίας, ενώ το κύριο νήμα κάνει να Process.Close ... BOOM

Απαντήθηκε 10/12/2008 στις 14:26
πηγή χρήστη

ψήφοι
1

Εάν επισυνάψετε ένα πρόγραμμα εντοπισμού σφαλμάτων στη διαδικασία συντριβή, θα ξέρετε ακριβώς γιατί συνετρίβη. Εδώ είναι ένα λεπτομερές tutorial για τον εντοπισμό σφαλμάτων ατυχήματα: http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx

Απαντήθηκε 10/12/2008 στις 05:11
πηγή χρήστη

ψήφοι
1

Δοκιμάστε να προσθέσετε ένα φλος μετά την tw.Write. Αυτό θα πρέπει να προκαλέσει την πλήρη παραγωγή μέχρι το σημείο αποτυχίας που θα παραχθούν, οι οποίες μπορεί να περιλαμβάνουν μηνύματα λάθους από το εκτελέσιμο (αν αυτό είναι αυτό που συντρίβεται;)

Απαντήθηκε 09/12/2008 στις 23:27
πηγή χρήστη

ψήφοι
1

Ποια είναι η συντριβή που παίρνετε; Μια εξαίρεση Καθαρή;

Αυτό το αρχείο δεν είναι γραμμένο εντελώς μπορούσε να είναι επειδή δεν έχετε ξεπλύνετε το ρεύμα στο αρχείο και στη συνέχεια κλείστε το.

Νομίζω ότι θα μπορούσε να είναι ένα πρόβλημα που θα χρησιμοποιούν το ίδιο ρεύμα τόσο για τυποποιημένα και λάθος μηνύματα. Αυτό μπορεί να οδηγήσει σε προβλήματα συγχρονισμός.

Απαντήθηκε 09/12/2008 στις 21:05
πηγή χρήστη

ψήφοι
0

Έχω δοκιμαστεί κωδικό σας με μια σειρά από διαφορετικά εκτελέσιμα και δεν ήταν σε θέση να το πάρει για να συντρίψει τον τρόπο που περιγράφετε. Ίσως είναι ένα θέμα με τη διαδικασία είστε εκτέλεσης;

Απαντήθηκε 09/12/2008 στις 23:38
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more