Фоновые работники - PullRequest
       28

Фоновые работники

0 голосов
/ 07 октября 2011

Я создал метод, который перечисляет все папки ftp в пути.
Моя проблема заключается в том, что мне нужно вернуть это как массив.
Но это фоновый рабочий, и я могу только вернутьэто к "RunWorkerCompleted",
с e.Result.
1) Как я могу передать параметр методу? (из background-worker)
2) Как я могу вернуть массив папокобычному методу?
вроде так:

private void btnOpen_Click_1(object sender, EventArgs e)
        {
           string[]/List... a=  getDirectories(**path**)?
        }

Ответы [ 2 ]

0 голосов
/ 07 октября 2011

Вы можете передавать свои аргументы, поскольку они являются объектами.BackgroundWorker принимает параметр object.Переменная object может содержать все: массив, ссылки и переменные.

Пример:

object[] args = new object[] { fileName, ....... };
this.backgroundWorker1.RunWorkerAsync(args);

в методе:

void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            object o = e.Argument;
            object[] args = (object[])o;
            string fileName = (string)args[0];
            ....
            object[] result = ....
            e.Result = result;
        }

Когда работазавершено:

void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

            object o = e.Result;
            object[] result = (object[])o;
            ...
        }
0 голосов
/ 07 октября 2011

У вас может быть список в качестве члена самой формы, и рабочий может добавлять в него, как он выполняет свою работу (поскольку рабочий код будет принадлежать форме, элемент будет находиться в области видимости).

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

Однако вы должны быть осторожны с этим подходом, чтобы не получить доступ к этому списку во время работы работника;как это не потокобезопасно.В .Net 4 вы можете использовать ConcurrentBag - поточно-ориентированный.

Если вы не хотите этого делать, тогда Result член аргументов события, передаваемых вКак вы говорите, событие RunWorkerCompleted используется для передачи результатов, и именно здесь вы должны вернуть свой список.Вы также можете использовать событие ProgressChanged ( на MSDN ) для потоковой передачи отдельного снимка результатов.

Я не думаю, что это неоправданно: асинхронные операции принципиально отличаютсяПарадигма синхронных вызовов, вы просто не можете использовать одну и ту же семантику «вызов и возврат».

...