2012-08-09 18 views
5

में प्रक्रिया, जबकि समय लेने वाली पाइथन लिपि के निष्पादन के दौरान, मैं पृष्ठभूमि कार्यकर्ता के साथ प्रगति पट्टी प्रदर्शित करने के लिए आईयू का प्रबंधन करता हूं।पृष्ठभूमि कार्यकर्ता त्रुटि

मैंने पृष्ठभूमि कार्यकर्ता को सफलतापूर्वक उपयोग किया है जब मुझे ईवेंट OutputDataReceived की आवश्यकता नहीं है, लेकिन जिस स्क्रिप्ट का मैं उपयोग कर रहा हूं, वह कुछ प्रगति मानों को प्रिंट करता है जैसे कि "" 10 "," 80 ", ..), इसलिए मुझे घटना OutputDataReceived सुनें।

मुझे यह त्रुटि मिलती है: This operation has already had OperationCompleted called on it and further calls are illegal. इस लाइन में progress.bw.ReportProgress(v);

मैंने 2 पृष्ठभूमि कार्यकर्ता उदाहरणों, एक निष्पादन और अन्य सुनवाई का उपयोग करने की कोशिश की, यह कोई त्रुटि नहीं देता है, लेकिन ऐसा लगता है कि ईवेंट 'आउटपुटडेटा रिसीव' नहीं है, इसलिए मुझे प्रगति पट्टी में कोई प्रगति दिखाई नहीं दे रही है।

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"); 


    } 
+1

आपको पता है कि सी # 4 पाइथन को थोड़ा और सीधे समर्थन करता है? –

+0

आयरन पायथन के लिए मेरा प्रतिरोध यह है कि, मैं "आर्कपी" का उपयोग कर रहा हूं इसलिए आयरन पायथन के लिए बाध्यकारी आर्कपी काफी आसान नहीं है। – geogeek

उत्तर

5

समस्या नहीं है के रूप में कुछ भी नहीं "इंतज़ार कर" प्रक्रिया को समाप्त करने के लिए (जब से तुम बाहर proc.WaitForExit() टिप्पणी की) है कि BackgroundWorker के DoWork हैंडलर जैसे ही प्रक्रिया शुरू होने से समाप्त होने पर, है। एक बार BackgroundWorker कार्य हैंडलर पूरा हो जाने पर, आप उस उदाहरण का उपयोग करके प्रगति की रिपोर्ट नहीं कर सकते हैं।

चूंकि Process.Start पहले से ही असीमित है, पृष्ठभूमि कार्यकर्ता का उपयोग करने का कोई कारण नहीं है। तुम बस OutputDataReceived से कॉल यूआई पर अपने आप को थ्रेड मार्शल कर सकते हैं:

///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()); 
     // progress.bw.ReportProgress(v); 
     this.BeginInvoke(new Action(() => { 
      this.progressBar.Value = v; 
     })); 
    } 
} 

आप इस का उपयोग करते हैं, BackgroundWorker बिल्कुल नहीं बनाते हैं।

+0

आपका समाधान काम करता प्रतीत होता है, लेकिन मुझे लगता है कि मुझे स्क्रिप्ट स्तर में कोई त्रुटि है, क्योंकि इसका व्यवहार मानक कमांड लाइन व्यवहार से बदलता है, इसलिए इसे केवल 2 घटनाएं मिलती हैं जिनमें पहले मान "0" और दूसरा शून्य मूल्य होता है, जबकि मैं मैं int के 10 मूल्यों की उम्मीद कर रहा हूँ। – geogeek

0

BackgroundWorker एक ReportProgress विकल्प है कि सिर्फ इस लिए बनाया गया है है:

कोड है कि मैं का इस्तेमाल किया नीचे

BackgroundWorker.ReportProgress Method (Int32, Object)

+0

कोई प्रश्न या टिप्पणी नहीं। बस एक नीचे वोट। क्यूं कर? – Paparazzi

+0

बहुत धन्यवाद श्रीमान ब्लम, रिपोर्ट प्रोग्रेस फ़ंक्शन त्रुटि का स्रोत था इसलिए मैंने इसे टालने के लिए एक समाधान खोजने की कोशिश की। – geogeek

संबंधित मुद्दे