Иногда при программировании сталкиваешься с задачей, которая выполняется длительное время. Обычно такие операции выполняют в отдельном потоке, чтобы не мешать ходу работы программы – таким образом решается проблема недоступности потока программы во время выполнения длительной операции, однако тут же возникает проблема синхронизации полученных в результате длительных вычислений данных с данными программы. Тут не работает привычная присваивания:

В моей программе, я использую BackgroundWorker’ы для выполнения длительных вычислений. BackgroundWorker асинхронно выполняет поставленную ему задачу (в событии DoWork), а после ее выполнения может сделать еще какие-нибудь действия (событие RunWorkerCompleted):

К сожалению, если мы передадим переменную, которая должна измениться в результате выполнения асинхронного запроса с модификаторами out или ref следующим образом:

, то это приведет к ошибке на этапе компиляции, т.к. передача ref/out переменных в анонимные методы запрещена.

Обойдем это с использованием собственного класса:

Класс очень простой: он состоит из свойства Value типа Т (т.е. любого, заявленного заранее, типа) и события, которое срабатывает, когда Value изменяется.

Пример использования класса:

В данном случае, strings перестанет равняться null в момент завершения асинхронной операции.