Подтвердить что ты не робот

С# Настройка рабочего стола e.Result в DoWork и получение значения в WorkCompleted

С# 2008 SP1

Я использую фона рабочего

Если одно из условий не выполняется, я установил e.cancel в значение true и присвойте строку элементу e.result. Там все работает.

Однако, когда срабатывает workCompleted, я проверяю e.Result и получаю исключение "e.result выдает исключение типа systeminvalidoperation".

Думаю, я мог бы использовать глобальную переменную, которая будет установлена ​​в DoWork, и сравнить ее с выполненной работой. Но это может быть небезопасно.

Может ли кто-нибудь сказать мне, почему я получаю это с e.Result, и как я могу это решить?

Большое спасибо,

    private void bgwPrepareCall_DoWork(object sender, DoWorkEventArgs e)
    {
        // Check to see if the called number is blocked. 
        // If the nubmer is blocked display error message.
        if (this.IsNoGateway(sipUsername, statusDisplay1.PhoneNumber))
        {
            // this.SetIdleState(DialerErrorMessage.GetErrorDescription(12));
            e.Cancel = true;
            e.Result = "NoGateway";
            return;
        }

        if (!this.IsInvalidTelephoneNumber(sipUsername, statusDisplay1.PhoneNumber))
        {
            // this.SetIdleState(DialerErrorMessage.GetErrorDescription(13));
            e.Cancel = true;
            e.Result = "InvalidNumber";
            return;
        }
    }

    private void bgwPrepareCall_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            if (e.Cancelled)
            {
                // Failed
                switch (e.Result.ToString())
                {
                    case "NoGateway":
                        Console.WriteLine("NoGateway: [ Failed ]");
                        break;

                    case "InvalidNumber":
                        Console.WriteLine("InvalidNumber: [ Failed ]");
                        break;

                    default:
                        Console.WriteLine("Unknown");
                        break;
                }
            }
            if (!e.Cancelled)
            {
                // Successfull
                Console.WriteLine("NoGateway: [ ok ]");    
                Console.WriteLine("InvalidNumber: [ ok ]");
            }
        }
        else
        {
            Console.WriteLine("PrepareCall Failed: [ " + e.Error.Message + " ]");
        }
    }
4b9b3361

Ответ 1

От MSDN:

Если операция завершена успешно, и его результат назначенный в обработчике событий DoWork, вы можете получить доступ к результату через RunWorkerCompletedEventArgs.Result свойство.

и:

Обработчик события RunWorkerCompleted всегда должны проверять ошибку и Отмененные свойства перед доступом свойство Result. Если исключение был поднят или если операция была отменен, доступ к результату свойство вызывает исключение.

Итак, если он не завершился успешно (т.е. вы его отменили), похоже, что он не будет работать. Возможно, подумайте о возврате данных об аннулировании в качестве результата (как успеха) для вашего прерывания, обнаружении разницы в обработчике завершения?

Ответ 2

Свойство Result предназначено для представления результата завершенной операции. Вы установили Cancel в значение true, что означает, что операция была отменена, поэтому результат не должен быть.

Похоже, что вы должны закодировать "Я прервал, потому что что-то не так", в ваш результат или выбросить исключение, которое будет установлено как свойство Error в результате вместо этого - Cancel предназначено для установки, если рабочий заметил, что вызов был отменен извне.

Документы для RunWorkerCompletedEventArgs.Result state:

Обработчик события RunWorkerCompleted всегда должны проверять ошибку и Отмененные свойства перед доступом свойство Result. Если исключение был поднят или если операция была отменен, доступ к результату свойство вызывает исключение.

В разделе "Исключения" в документации также указано, что он будет генерировать исключение, если Cancelled является истинным.

Ответ 3

Это, скорее всего, потому, что код отменяет работу, а не завершает ее. Поэтому попробуйте получить результат в ветке if (! E.Cancel).