सवाल BackgroundWorker का उपयोग कैसे करें?


मुझे पता है कि इसमें 3 तरीके हैं। मेरे कार्यक्रम में मेरे पास एक संदेश भेजने का एक तरीका है। यह अक्सर देर हो चुकी है और कार्यक्रम कभी-कभी बटन प्रेस के जवाब में संदेश नहीं भेजता है। कभी-कभी मैं अपेक्षा करता हूं कि 5 सेकंड जितना देर हो जाएगा और प्रोग्राम फ्रीज हो जाएगा। मैं एक का उपयोग करना चाहता हूँ BackgroundWorker संदेश को अपेक्षित रूप से भेजने के लिए और प्रोग्राम को हर समय सामान्य रूप से चलाने की अनुमति दें। मेरे पास बटन हैंडलर में संदेश भेजने के लिए कोड था। अब मैं इस समकक्ष कोड कहां रखूं? मैं यह सब अभी भी एक बटन प्रेस द्वारा संभाला जाना चाहूंगा।

क्या यह उचित हैंडलर है?

backgroundWorker1.RunWorkerAsync();

और में:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {}

मैं अपना कोड बटन हैंडलर में डालूँगा? और इससे पहले:

carga.progressBar1.Minimum = 0;
carga.progressBar1.Maximum = 100;

कारगा मेरा दूसरा रूप है जहां प्रोग्रेसबार है। मैं इस परिदृश्य में पृष्ठभूमिवर्कर का उपयोग कैसे करूं?


44
2018-06-26 00:08


मूल




जवाब:


आप केवल प्रगति पट्टी को अपडेट कर सकते हैं ProgressChanged या RunWorkerCompleted इवेंट हैंडलर इन्हें यूआई थ्रेड के साथ सिंक्रनाइज़ कर रहे हैं।

मूल विचार है। Thread.Sleep बस कुछ काम सिमुलेट करता है। इसे अपने असली रूटिंग कॉल के साथ बदलें।

public Form1()
{
    InitializeComponent();

    backgroundWorker1.DoWork += backgroundWorker1_DoWork;
    backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
    backgroundWorker1.WorkerReportsProgress = true;
}

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(1000);
        backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

70
2018-06-26 00:13



आपके बटन 1_Click () उदाहरण में - मैं बैकग्राउंड वर्कर से वापस मुख्य (UI) थ्रेड पर वापस डेटा कैसे प्राप्त करूं? - Nicholas Kreidberg
अजीब, मुझे अपनी प्रगति चेंज विधि से यूआई (डब्ल्यूपीएफ प्रगति पट्टी) को अपडेट करने के बारे में अपवाद मिला है। इसके अलावा, stackoverflow.com/questions/9732709/... ऐसा लगता है कि मेरे लिए एक समान समस्या है, और इसकी आवश्यकता बताती है Application.Current.Dispatcher.Invoke()। इस बारे में कोई विचार? - Bill Hoag
हम क्यों ले रहे हैं वस्तु प्रेषक लगभग हर विधि में पैरामीटर। @Aza - Lahiru Gamage
@LahiruGamage यह DoWork, प्रोग्रेस चेंज इत्यादि द्वारा आवश्यक है और इसका उपयोग यह पता लगाने के लिए किया जा सकता है कि किस ऑब्जेक्ट को विधि कहा जाता है। अधिक जानने के लिए दस्तावेज़ देखें: docs.microsoft.com/en-us/dotnet/api/... - Christian Seiler


मुझे पता है कि यह थोड़ा पुराना है, लेकिन अगर कोई दूसरा शुरुआती दौर में जा रहा है, तो मैं कुछ कोड साझा करूंगा जो बुनियादी परिचालनों को थोड़ा और अधिक कवर करता है, यहां एक और उदाहरण है जिसमें प्रक्रिया को रद्द करने और रिपोर्ट को रद्द करने का विकल्प भी शामिल है उपयोगकर्ता को प्रक्रिया की स्थिति। मैं ऊपर दिए गए समाधान में एलेक्स एज़ा द्वारा दिए गए कोड के शीर्ष पर जोड़ने जा रहा हूं

public Form1()
{
    InitializeComponent();

    backgroundWorker1.DoWork += backgroundWorker1_DoWork;
    backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
    backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;  //Tell the user how the process went
    backgroundWorker1.WorkerReportsProgress = true;
    backgroundWorker1.WorkerSupportsCancellation = true; //Allow for the process to be cancelled
}

//Start Process
private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

//Cancel Process
private void button2_Click(object sender, EventArgs e)
{
    //Check if background worker is doing anything and send a cancellation if it is
    if (backgroundWorker1.IsBusy)
    {
        backgroundWorker1.CancelAsync();
    }

}

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(1000);
        backgroundWorker1.ReportProgress(i);

        //Check if there is a request to cancel the process
        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
            backgroundWorker1.ReportProgress(0);
            return;
        }
    }
    //If the process exits the loop, ensure that progress is set to 100%
    //Remember in the loop we set i < 100 so in theory the process will complete at 99%
    backgroundWorker1.ReportProgress(100);
}

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
         lblStatus.Text = "Process was cancelled";
    }
    else if (e.Error != null)
    {
         lblStatus.Text = "There was an error running the process. The thread aborted";
    }
    else
    {
       lblStatus.Text = "Process was completed";
    }
}

44
2018-06-10 10:14