C # Фоновый рабочий параметр e.Result в DoWork и получение значения обратно в WorkCompleted - PullRequest
17 голосов
/ 13 мая 2009

C # 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 + " ]");
        }
    }

Ответы [ 3 ]

27 голосов
/ 13 мая 2009

С MSDN :

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

и

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

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

19 голосов
/ 13 мая 2009

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

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

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

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

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

2 голосов
/ 13 мая 2009

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

...