Могу ли я получить доступ к аргументу, что BackgroundWorker был запущен после его завершения? - PullRequest
0 голосов
/ 14 февраля 2012

Когда я запускаю BackgroundWorker, я могу передать произвольный аргумент :

backgroundWorker1.RunWorkerAsync(someStuff);

Предполагается, что этот произвольный аргумент будет передан методу DoWork:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   Object someStuff = e.Argument;
   ...
}

Теперь я хотел бы получить тот же аргумент во время обратного вызова Complete :

private void backgroundWorker1_RunWorkerCompleted(object sender, 
                       RunWorkerCompletedEventArgs e)
{
    Object myStuff = e.Argument;
    ...
}

За исключением того, что не e.Argument.

Там есть a UserState:

private void backgroundWorker1_RunWorkerCompleted(object sender, 
                        RunWorkerCompletedEventArgs e)
{
    Object myStuff = e.UserState;
    ...
}

Но это известная ошибка, что UserState никогда не устанавливается или не устанавливается ни к чему.

Итак, что такое хороший обходной путь?

Чтение бонусов

1 Ответ

2 голосов
/ 14 февраля 2012

Возвращает аргумент в массиве объекта вместе с фактическим результатом. из обработчика doWork.

        BackgroundWorker bgw = null;

    void main()
    {
        bgw = new BackgroundWorker();
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        string otherResult = "Some Work Done";
        e.Result = new Object[2] {e.Argument, otherResult};
    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //writes the argument;
        Console.WriteLine(((object[])e.Result)[0]);
    }
...