Основа рабочего процесса: асинхронные операции (длительный сетевой ввод / вывод) - PullRequest
1 голос
/ 13 июня 2010

Мне нужно создать приложение, которое будет запускаться несколько раз в день (оно не является интерактивным).

Для работы ему нужны БОЛЬШИЕ объемы данных из Интернета (мегабайты) через довольно медленныесоединение, поэтому вызовы службы WCF занимают довольно много времени.

В то же время, он должен выполнять локальные вычисления и имеет сложный процесс инициализации.

Итак, что я хочу сделать, этосоздать рабочий процесс, который асинхронно выбирает данные (занимает несколько минут), уже инициализируя / вычисляя локально.

Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 13 июня 2010

Вы можете использовать компонент BackgroundWorker для каждой асинхронной операции - один для вычислений и один для загрузки данных.

Я бы предложил использовать один поток для каждой операции. После запуска каждого потока вызовите thread.Join () по одному на каждый поток, чтобы дождаться завершения каждого потока.

, например

Thread[] workers = new Thread[2];
workers[0] = new Thread(dataDownloader.Fetch);
workers[1] = new Thread(calculator.DoComplexCalculations);

foreach(Thread t in workers)
{
   t.Start();
}
foreach(Thread t in workers)
{
   t.Join();
}
1 голос
/ 13 июня 2010

Вы можете генерировать асинхронные классы вашей службы wcf (используя commandlinetool). Если вы запустите эти асинхронные методы, они немедленно вернутся и вызовут делегат обратного вызова, когда они закончат. Таким образом, вы можете делать все свои расчеты, пока вы ждете

...