Как в основной форме Отменить backgroundWorker другой формы

307
02 сентября 2021, 13:10

Ребята. Мне нужно отменить BakgroundWorker из основной формы, которая была запущена в другой форме. Я пытаюсь решить эту проблему с помощью делегатов. Возможно есть другие пути решения? Подскажите пожалуйста! Привожу для примера код главной формы:

public partial class MainForm : Form
{
    public MainForm(string FIO)
    {
       //some code
    }
    public event EventHandler<EventArgs> Canceled;
    private void Button5_Click(object sender, EventArgs e)
    {
       if (Canceled != null)
           Canceled(sender, e);
    }
}

Код формы, в которой был запущен backgroundWorker

public partial class CarriageForm : Form
{
    public CarriageForm(ToolStripProgressBar toolStripProgressBar1, ToolStripLabel toolStripLabel1)
    {
        //some code
    }
private void CarriageForm_Load(object sender, EventArgs e)
{
    progBar.Visible = false;
    if (!backgroundWorker1.IsBusy)
    {
        progBar.Visible = true;
        progBar.Maximum = GetTotalRecords();
        string GetCarriage = "Select dc.ID, dc.CarNumber [Номер вагона],dc.AXIS [Осность],do.ID [OwnerID], do.Name [Собственник],do.FullName [Собственник полное наименование] From d__Carriage dc Left Join d__Owner do on do.ID = dc.Owner_ID";
        MainForm mainForm = new MainForm(null);
        mainForm.Canceled += new EventHandler<EventArgs>(Button2_Click);
        backgroundWorker1.RunWorkerAsync(GetCarriage);
    }
    //BackgroundWorker1_DoWork...
    //BackgroundWorker1_ProgressChanged...
    //BackgroundWorker1_RunWorkerCompleted..
public void Button2_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                // Stop the Background Thread execution
                Application.UseWaitCursor = false;
                System.Windows.Forms.Cursor.Current = Cursors.Default;
                backgroundWorker1.CancelAsync();
                progBar.Value = 0;
                progBar.Visible = false;
                TlStpLabel.Text = "Пользователь умышленно отменил";
            }
        }
}

Для наглядности

Answer 1

Для BW второй формы нужно выставить Modifiers в Public

При запуске второй формы получаем ссылку на BW, и используем эту ссылку для отмены работы.

public partial class Form1 : Form
{
    //для ссылки на Bw второго окна
    private BackgroundWorker _bw;
    public Form1()
    {
        InitializeComponent();
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Text = "Первая форма";
        _buttonOpenForm.Click += ButtonOpenForm_Click;
        _buttonStopBgW.Click += ButtonStopBgW_Click;
    }
    private void ButtonOpenForm_Click(object sender, EventArgs e)
    {
        var form2 = new Form2();
        form2.Owner = this;
        //передаем ссылку на Bw
        _bw = form2._backgroundWorker;
        form2.Show();
    }
    private void ButtonStopBgW_Click(object sender, EventArgs e)
    {
        //проверяем, что Bw есть и что он работает
        //тогда отменяем
        if (_bw != null && _bw.IsBusy) _bw.CancelAsync();
    }
}
Answer 2

Можно создать вспомогательный сервис, который будет содержать все методы по работе с воркерами, создавать новые отменять старые и тд. Если хочется проще, то сделать переменную воркера публичной, и пошарить ссылку на дочернюю форму с главной. То есть в коде главной форме обратится к дочерней, и ее воркеру.

READ ALSO
Какой смысл от использования объектов в качестве ключа?

Какой смысл от использования объектов в качестве ключа?

Открыл исходник одного из компонента WinForms и увидел это:

164
исключить значение

исключить значение

в столбце "отправитель" и "получатель" встречаются одинаковые фамилии (когда перевод осуществляется родственникуНапример:

169
woocommerce liqpay Запрос не отрабатывает

woocommerce liqpay Запрос не отрабатывает

После нажатия на кнопку, происходит редирект на страницу "Заказ принят", а не на liqpay

88
Как использовать Lumen framework без роутера?

Как использовать Lumen framework без роутера?

собираюсь писать плагин для Wordpress хочу для своей работы использовать фреймворк Lumen, но как правильно его использовать в обход классического...

221