У меня есть приложение, которое извлекает достаточное количество данных из разных источников. Локальная база данных, сетевая база данных и веб-запрос. Любой из них может занять несколько секунд. Итак, сначала я решил запустить их параллельно:
Parallel.Invoke(
() => dataX = loadX(),
() => dataY = loadY(),
() => dataZ = loadZ()
);
Как и ожидалось, все три выполняются параллельно, но выполнение всего блока не возвращается до тех пор, пока не будет выполнено последнее.
Затем я решил добавить в приложение счетчик или индикатор занятости. Я не хочу блокировать поток пользовательского интерфейса, или прядильщик не вращается. Поэтому их нужно запускать в async
режиме. Но если я запускаю все три в асинхронном режиме, то они в аффекте происходят "синхронно", просто не в том же потоке, что и пользовательский интерфейс. Я все еще хочу, чтобы они побежали параллельно.
spinner.IsBusy = true;
Parallel.Invoke(
async () => dataX = await Task.Run(() => { return loadX(); }),
async () => dataY = await Task.Run(() => { return loadY(); }),
async () => dataZ = await Task.Run(() => { return loadZ(); })
);
spinner.isBusy = false;
Теперь Parallel.Invoke не ждет, пока методы закончатся, и счетчик мгновенно отключится. Хуже того, dataX/Y/Z являются нулевыми, а исключения происходят позже.
Какая здесь правильная дорога? Должен ли я использовать BackgroundWorker вместо этого? Я надеялся использовать возможности.Net 4.5.