Что происходит с данными, которые передаются фоновому рабочему и от него? - PullRequest
5 голосов
/ 07 июля 2011

Что происходит с данными, которые передаются фоновому рабочему и от него?

Данные передаются из основного потока фоновому рабочему с помощью RunWorkerAsync:

backgroundWorker.RunWorkerAsync(myData);

Получается в обработчике событий DoWork в фоновом потоке:

myData = (Data)e.Argument;

После того, как DoWork обработал данные, он возвращает их, используя e.Result:

e.Result = myData;

Получено в обработчике события RunWorkerCompleted в основном потоке:

myData = (Data)e.Result;

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

Для справки я использую C #, .Net 3.5 и Windows Forms.

Ответы [ 3 ]

6 голосов
/ 07 июля 2011

Там действительно нет накладных расходов (при условии, что Data - это класс), поскольку передается только ссылка.Сами данные не «копируются» в поток - все потоки могут обращаться к данным в процессе (по большей части).

Я также хотел бы знать, что возможно получить доступ кданные в фоновом режиме из основного потока в поточно-ориентированном режиме.

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

5 голосов
/ 07 июля 2011

Объекты всегда передаются по ссылке. Нет никаких накладных расходов.

BackgroundWorker просто добавляет объект во внутреннюю очередь, а затем считывает его из очереди в потоке пользовательского интерфейса. (Это на самом деле сделано Control.MarshaledInvoke)

1 голос
/ 07 июля 2011

В переносе практически нет накладных расходов;это просто ссылка на объект (нет никакой сортировки задействованных данных).Вы потокобезопасны, если основной поток не обращается к данным между вызовом RunWorkerAsync и RunWorkerCompleted.

...