RunWorkerCompleted не запускается при запуске из FormClosing

У меня есть форма, которая должна сохранять несохраненные данные во внешнюю БД через вызов веб-службы. Когда пользователь вручную сохраняет данные, запускается RunWorkerCompleted, но не тогда, когда я вызываю метод через событие FormClosing.

Таймер срабатывает через несколько секунд после того, как пользователь изменяет значение в форме, и сбрасывается, если пользователь изменяет другое значение, идея состоит в том, что список "toSend" имеет более одного значения, и я могу публиковать несколько изменений одновременно так как вызовы веб-службы требуют много времени.

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (PublishBackgroundWorker.IsBusy)
            return;

        List<object> toSend = new List<object>();

        // Figure out what changed and add it to toSend ...
        toSend.Add(changedItems);

        if (toSend.Count >= 1)
            PublishBackgroundWorker.RunWorkerAsync(toSend);
    }

    private void PublishBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        if (((List<object>)(e.Argument)).Count > 0)
        {
            Service.SrvObjects[] ret = Svc.PublishItems(e.Argument));
        }
    }

    private void PublishBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "Ready" });
    }

    private void IPTUserInterfaceForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        timer1.Enabled = false;
        timer1_Tick(this, new EventArgs());
        //Application.DoEvents();
        while (PublishBackgroundWorker.IsBusy)
            System.Threading.Thread.Sleep(100);
    }

Имеет ли это смысл? Когда пользователь изменяет значение и закрывает форму до того, как таймер отключается, я вручную отмечаю галочку, надеясь, что PublishBackgroundWorker.IsBusy в какой-то момент имеет значение false и никогда не вызывается, потому что RunWorkerCompleted никогда не вызывается.

1 ответ

Решение

Проблема в том, что ваш Backgroundworker не занят только потому, что вы вызываете метод timerTick. Поэтому этот код никогда не будет достигнут, пока не пройдёт остальная часть метода, и форма не закроется, а приложение не закроется:

    while (PublishBackgroundWorker.IsBusy)
        System.Threading.Thread.Sleep(100);
Другие вопросы по тегам