2009-03-11 21 views
8

मेरे एप्लिकेशन के उपयोगकर्ता HTML टेक्स्ट को टेक्स्टबॉक्स नियंत्रण में टाइप करते हैं।मैं पृष्ठभूमि कार्यकर्ता प्रक्रिया को सही तरीके से रद्द और पुनरारंभ कैसे करूं?

मैं चाहता हूं कि मेरा एप्लिकेशन पृष्ठभूमि में उनके इनपुट को मान्य करे।

क्योंकि मैं सत्यापन सेवा को हथियार नहीं देना चाहता, मैंने प्रत्येक सत्यापन से पहले एक-दूसरे देरी में निर्माण करने की कोशिश की है।

हालांकि, मैं पहले से चल रहे पृष्ठभूमिवर्कर प्रक्रिया को सही ढंग से बाधित करने में सक्षम नहीं प्रतीत होता।

मेरे Visual Basic कोड:

 
Sub W3CValidate(ByVal WholeDocumentText As String) 

    'stop any already-running validation 
    If ValidationWorker.IsBusy Then 
     ValidationWorker.CancelAsync() 
     'wait for it to become ready 
     While ValidationWorker.IsBusy 
      'pause for one-hundredth of a second 
      System.Threading.Thread.Sleep(New TimeSpan(0, 0, 0, 0, 10)) 
     End While 
    End If 

    'start validation 
    Dim ValidationArgument As W3CValidator = New W3CValidator(WholeDocumentText) 
    ValidationWorker.RunWorkerAsync(ValidationArgument) 

End Sub 

ऐसा लगता है कि मेरी BackgroundWorker के CancelAsync() कॉल के बाद, अपने IsBusy कभी नहीं झूठी हो जाता है। यह एक अनंत लूप में फंस जाता है।

मैं क्या गलत कर रहा हूं?

+0

मैं प्रक्रिया से बाहर निकलने अगर e.Cancelled सच है मतलब है। – Pat

उत्तर

0

मैं इस लेख में इस सवाल का जवाब मिल गया: पैट्रिक Smacchia द्वारा

BackgroundWorker Closure and Overridable Task

मैं उसका कोड अनुकूलित किया है:

 
Private _ValidationArgument As W3CValidator 

Sub W3CValidate(ByVal WholeDocumentText As String) 
    If _ValidationArgument IsNot Nothing Then 
     _ValidationArgument = New W3CValidator(WholeDocumentText) 
     Exit Sub 
    End If 
    If Not ValidationWorker.IsBusy Then 
     ValidationWorker.RunWorkerAsync(New W3CValidator(WholeDocumentText)) 
     Exit Sub 
    End If 
    _ValidationArgument = New W3CValidator(WholeDocumentText) 
    ValidationWorker.CancelAsync() 
    Dim TimerRetryUntilWorkerNotBusy As New Windows.Threading.DispatcherTimer 
    AddHandler TimerRetryUntilWorkerNotBusy.Tick, AddressOf WorkTicker 
    TimerRetryUntilWorkerNotBusy.Interval = New TimeSpan(1) '100 nanoseconds 
    TimerRetryUntilWorkerNotBusy.Start() 
End Sub 

Sub WorkTicker(ByVal sender As Object, ByVal e As System.EventArgs) 
    If ValidationWorker.IsBusy Then 
     Exit Sub 
    End If 
    DirectCast(sender, Windows.Threading.DispatcherTimer).Stop() 
    ValidationWorker.RunWorkerAsync(_ValidationArgument) 
    _ValidationArgument = Nothing 
End Sub 
1

अपनी पृष्ठभूमि कार्यकर्ता प्रक्रिया पाश में आप
के लिए जांच करने की आवश्यकता backgroundWorkerPageProcess.CancellationPending
और तदनुसार बाहर निकलें। फिर एक बार जब आपका अस्तित्व लूप होता है तो बुसी को तदनुसार ध्वजांकित किया जाना चाहिए।

अपडेट: आप सेट करने के बाद = सही हैं क्या आप विधि से बाहर लौट रहे हैं? स्पिटबॉलिंग अपडेट 2: आपके पास बैकरवर्कवर्क पर वर्कर सपोर्ट्स कैनसेलेशन ध्वज सही है? इसके अलावा कार्यकर्ता पूरा विधि में बाहर लौट यदि e.Cancelled .... अधिक spitballs

अद्यतन 3: कुछ जाँच और मेरे अपने के संकलन के बाद यह लानत बात एक ही विधि के भीतर isbusy से बाहर कभी नहीं हो जाता है प्रकट होता है। - एक विकल्प व्यस्त होने पर बटन को अक्षम करना है और दूसरे को रद्द करना है, केवल उपयोगकर्ता के लिए सत्यापन को पुनः प्राप्त करने के लिए। - या आपके कार्यकर्ता पूर्ण विधि पर (यदि ई। रद्द) उचित सत्यापन के साथ अपनी सत्यापन विधि को कॉल करें ....

किसी भी तरह से बस्ट की तरह है। यहां बहुत मदद करने के लिए खेद है। इस तरह

+0

यही वही है जो मुझे उम्मीद थी। My DoWork() विधि e.Cancel = True सेट करती है यदि DirectCast (प्रेषक, पृष्ठभूमिवर्कर)। रद्द करना। लेकिन IsBusy कभी भी गलत पर वापस लौट आया। –

+0

मेरा DoWork() "e.Cancel = True" चलाता है फिर तुरंत "बाहर निकलें"। मेरा RunWorkerCompleted() बस यह किसी भी स्थिति के अंदर काम करता है: "यदि नहीं तो ई। रद्द कर दिया गया ... अंत अगर अंत उप"। या तो और करना चाहिए? –

+0

हां। मैंने ValidationWorker.WorkerSupportsCancellation = True सेट किया है। आपका क्या मतलब है "अगर रद्द हो गया तो बाहर निकलें"? –

8

कोशिश कुछ:

bool restartWorker = false; 

    void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
        // add other code here 
     if (e.Cancelled && restartWorker) 
     { 
      restartWorker = false; 
      backgroundWorker1.RunWorkerAsync(); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (backgroundWorker1.IsBusy) 
     { 
      restartWorker = true; 
      backgroundWorker1.CancelAsync(); 
     } 
     else 
      backgroundWorker1.RunWorkerAsync(); 
    } 
+1

RunWorkerAsync में नए पैरामीटर को पारित करने के लिए आप इसे कैसे संशोधित करेंगे? – tofutim

+0

मुझे यह उत्तर टेक्स्टबॉक्स के लिए उपयोगी पाया गया है जो डेटाबेस से सुझावों को देखता है।पैरामीटर पास करने के लिए पहली बार RunWorkerAsync (ऑब्जेक्ट) का उपयोग करता है और क्योंकि RunWorkerCompleted भी यूआई थ्रेड में चल रहा है, वहां नया मान पास करें। –

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