Soru Bir BackgroundWorker nasıl kullanılır?


3 yöntemi olduğunu biliyorum. Programımda bir mesaj göndermek için bir yöntem var. Genellikle geç kalır ve program bazen bir tuşa basma mesajını hiç göndermez. Zaman zaman beklediğimden 5 saniye kadar geç ve program donuyor. Kullanmak istiyorum BackgroundWorker Mesajı beklendiği gibi göndermek ve programın her zaman normal şekilde çalışmasına izin vermek. İletiyi bir düğme işleyicisine göndermek için kodum vardı. Şimdi bu eşdeğer kodu nereye koyacağım? Tüm bunların hala bir düğmeye basılarak ele alınmasını istiyorum.

Bu uygun işleyici mi?

backgroundWorker1.RunWorkerAsync();

ve:

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

Kodumu düğme işleyicisine koyacağım? Ve bu daha önce:

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

Carga, ProgressBar'ın olduğu diğer formum. Bu senaryoda bir BackgroundWorker'ı nasıl kullanırım?


44
2018-06-26 00:08


Menşei




Cevaplar:


İlerleme çubuğunu yalnızca ProgressChanged veya RunWorkerCompleted Bu olay işleyicileri, bunlar gibi UI iş parçacığı ile eşitlenir.

Temel fikir. Thread.Sleep sadece burada bazı çalışmaları simüle eder. Gerçek yönlendirme aramanızla değiştirin.

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



Button1_Click () örneğinizde - arka plan çalışanından geri dönen verileri ana (UI) iş parçacığına nasıl geri alabilirim? - Nicholas Kreidberg
Tek, UI (WPF ilerleme çubuğu) benim ProgressChanged yönteminden güncelleme hakkında bir istisna var. Ayrıca, stackoverflow.com/questions/9732709/... benimkiyle benzer bir mesele var gibi görünüyor ve Application.Current.Dispatcher.Invoke(). Bunun hakkında bir fikrin var mı? - Bill Hoag
Neden alıyoruz nesne göndereni hemen hemen her yöntemde parametre. @Aza - Lahiru Gamage
@LahiruGamage DoWork, ProgressChanged vb. Tarafından istenir ve yöntem olarak adlandırılan nesneyi bulmak için kullanılabilir. Daha fazla bilgi için belgelere bakın: docs.microsoft.com/en-us/dotnet/api/... - Christian Seiler


Bunun biraz eski olduğunu biliyorum, ancak başka bir başlangıç ​​başladığında, temel işlemlerin biraz daha fazlasını içeren bazı kodları paylaşacağım, işte aynı zamanda süreci iptal etme ve rapor etmeyi de içeren başka bir örnek. kullanıcıya işlemin durumunu. Yukarıdaki çözümde Alex Aza tarafından verilen kodun üstüne ekleyeceğim

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