während der Ausführung eines zeitaufwendigen Python-Skript, würde ich die IU mit Hintergrund-Worker verwalten, um eine Fortschrittsanzeige anzuzeigen.Prozess im Hintergrund worker Fehler
Ich habe den Hintergrund-Arbeiter erfolgreich verwendet, wenn ich nicht das Ereignis OutputDataReceived
brauche, aber das Skript, das ich verwende, druckt einige Fortschrittswerte wie ("10", "80", ..), also habe ich Hören Sie das Ereignis OutputDataReceived
.
Ich erhalte diesen Fehler: This operation has already had OperationCompleted called on it and further calls are illegal.
in dieser Zeile progress.bw.ReportProgress(v);
.
i2 Hintergrund Arbeiter Instanzen zu verwenden versucht, kann man versuchen und die anderen zuhört, gibt es keine Fehler, aber es scheint nicht vom Ausgang nennen OutputDataReceived 'Ich sehe so keinen Fortschritt in der Statusleiste.
unter dem Code, den ich verwendet:
private void execute_script()
{
progress.bw.DoWork += new DoWorkEventHandler(//progress.bw is reference to the background worker instance
delegate(object o, DoWorkEventArgs args)
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "python.exe";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.Arguments = @".\scripts\script1.py " + file_path + " " + txtscale.Text;
//proc.StartInfo.CreateNoWindow = true;
//proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
proc.StartInfo.RedirectStandardOutput = true;
//proc.EnableRaisingEvents = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardError = true;
proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(proc_OutputDataReceived);
proc.Start();
proc.BeginOutputReadLine();
//proc.WaitForExit();
//proc.Close();
});
progress.bw.RunWorkerAsync();
}
///the function called in the event OutputDataReceived
void proc_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
//throw new NotImplementedException();
if (e.Data != null)
{
int v = Convert.ToInt32(e.Data.ToString());
MessageBox.Show(v.ToString());
// report(v);
progress.bw.ReportProgress(v);
}
else
MessageBox.Show("null received");
}
Sie wissen, dass C# 4 Python etwas direkter unterstützt? –
meine contraint zu Iron python ist das, ich benutze "Arcpy" so verbindlich Arcpy zu Iron Python ist nicht ganz einfach. – geogeek