Как я могу исправить эту проблему, связанную с BackgroundWorkers в C #? - PullRequest
0 голосов
/ 31 января 2009

У меня есть проект CopyFile и Directory. Но когда я начал копировать Gui, он зависает. Я ничего не могу сделать с копированием файлов. Поэтому я нашел свое решение в компоненте BackgroundWorker. Но у меня тоже есть проблема с этим компонентом.

Есть 3 переключателя и командная кнопка. Когда я нажимаю командную кнопку, она проверяет, отмечен ли radiobutton1 или же отмечен radiobutton2, или отмечен radiobutton3. Если установлен флажок radiobutton1, много чего делать, или если отмечен флажок radiobutton2, сделать что-то еще и т. Д. Для 3 радиокнопок есть 3 рабочих. Когда я проверил radiobutton1, backgroundworker1 событие dowork работает. Когда я проверил radiobutton2, backgroundworker2 событие dowork работает. и т.д ...

Моя проблема в том, что я установил radiobutton1 и нажал кнопку комманд. Начиная backgroundworker1 делать рабочее событие, но он также продолжает контролировать, если отмечен radiobutton2 или нет. Это не останавливается, поэтому я получаю ошибки. Мой код ниже:

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

    if (radioButton2.Checked)
    {
        StreamReader sr = new StreamReader(Application.StartupPath + @"\hakimler.txt");

        while ((satir = sr.ReadLine()) != null)
        {
            try
            {
                bool copy = CopyDirectory(DosyaYolu.kaynak, @"\\" + satir + @"" + DosyaYolu.hedef, true);
                if (copy)
                {
                    kopya += 1;
                }
                else
                {
                    sw.WriteLine(satir);
                }
            }
            catch (Exception)
            {

            }
        }

        sw.Close();
        MessageBox.Show("İşlem tamamlandı", "İşlem Sonu", MessageBoxButtons.OK, MessageBoxIcon.Information);
        lblkopya.Text = "Başarıyla tamamlanan iş sayısı : " + kopya.ToString();
        return;
    }

    if (chkPersonel.Checked == true)
    {
        StreamReader sr = new StreamReader(Application.StartupPath + @"\personel.txt");

        while ((satir = sr.ReadLine()) != null)
        {
            try
            {
                bool copy = CopyDirectory(DosyaYolu.kaynak, @"\\ab04500-" + satir + @"" + DosyaYolu.hedef, true);
                //bool copy = CopyDirectory(Application.StartupPath + @"\TELEFON REHBERİ", @"\\" + satir + @"\c$\Documents and Settings\All Users\Start Menu", true);
                if (copy)
                {
                    kopya += 1;
                }
                else
                {
                    sw.WriteLine(satir);
                }
            }
            catch (Exception)
            {

            }
        }

        sw.Close();

        MessageBox.Show("İşlem tamamlandı", "İşlem Sonu", MessageBoxButtons.OK, MessageBoxIcon.Information);
        lblkopya.Text = "Başarıyla tamamlanan iş sayısı : " + kopya.ToString();
        return;
    }
    else
    {
        if (txtBilgisayar.Text == "" && txtDongu.Text == "")
        {
            MessageBox.Show("Boşlukları dolduralım bi zahmet :@", "Bilgisayar Kodlarını girelim lütfen!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return;
        }

        bilgisayar = Convert.ToInt32(txtBilgisayar.Text);
        dongu = Convert.ToInt32(txtDongu.Text);

        for (int i = bilgisayar; i <= dongu; i++)
        {
            try
            {
                bool copy = CopyDirectory(DosyaYolu.kaynak, @"\\ab04500-" + bilgisayar + @"" + DosyaYolu.hedef, true);
                if (copy)
                {
                    kopya += 1;
                }
                else
                {
                sw.WriteLine(satir);
                }
            }
            catch (Exception)
            {

            }

            if (i == dongu)
            {
                sw.Close();
                MessageBox.Show("İşlem tamamlandı", "İşlem Sonu", MessageBoxButtons.OK, MessageBoxIcon.Information);
                lblkopya.Text = "Başarıyla tamamlanan iş sayısı : " + kopya.ToString();
            }

            bilgisayar += 1;
        }

}


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    sw = new StreamWriter(DateTime.Today.ToShortDateString().ToString() + "_ulasmayanlar.txt", true);
    StreamReader sr = new StreamReader(Application.StartupPath + @"\savcilar.txt");

    while ((satir = sr.ReadLine()) != null)
    {
        try
        {
            bool copy = CopyDirectory(DosyaYolu.kaynak, @"\\" + satir + @"" + DosyaYolu.hedef, true);
            //bool copy = CopyDirectory(Application.StartupPath + @"\TELEFON REHBERİ", @"\\" + satir + @"\c$\Documents and Settings\All Users\Start Menu", true);
            if (copy)
            {
                kopya += 1;
            }
            else
            {
                sw.WriteLine(satir);
            }
        }
        catch (Exception)
        {

        }
    }
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    sw.Close();

    MessageBox.Show("İşlem tamamlandı", "İşlem Sonu", MessageBoxButtons.OK, MessageBoxIcon.Information);
    lblkopya.Text = "Başarıyla tamamlanan iş sayısı : " + kopya.ToString();
}

управление, если radiobutton1 проверено или нет, если оно проверено как истинное, его запуск bgworkers выполняет рабочее событие, и оно будет продолжаться, если проверено radiobutton2 или нет, если radiobutton3 проверил или нет, blabla не останавливается, когда его видеть radiobutton1 проверил true.


да, я хочу прекратить контролировать чекчед другой trueobutton true или нет. Если chevked radiobutton1 true, то делать только фоновые события dowork и STOP.

1 Ответ

2 голосов
/ 31 января 2009

Я не совсем уверен, в чем конкретно заключается ваша проблема, но в вашем коде, если ваш radioButton1 Проверено, что фоновый работник сделает это, а иначе - нет. Разве это не то, что вы хотите?

Я не вижу кода для других переключателей, которые вы упомянули.


Ах, так вы хотите остановить фоновых рабочих, когда вы проверяете другую кнопку-переключатель? В вашем методе dowork() вы должны проверить, если bg.CancellationPending == true, и выйти из метода, если он есть.

Также вы должны установить для WorkerSupportsCancellation значение true после инициализации рабочего BG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...