Я должен создать приложение, которое будет запущено несколько раз в день (это не - интерактивное).
Для работы этому нужны Большие объемы данных из Интернета (мегабайты) через довольно медленное соединение, таким образом, служебные вызовы WCF занимают некоторое время.
В то же время это должно выполнить локальные вычисления и имеет сложный процесс инициализации.
Так, что я хочу сделать, должен создать рабочий процесс, который асинхронно выбирает данные (занимает несколько минут), уже инициализируя / вычисление локально.
Существует ли способ выполнить это?
Вы можете использовать компонент 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();
}
Вы можете сгенерировать асинхронные классы своей службы wcf (используя команду linetool). Если вы запустите эти асинхронные методы, они немедленно вернутся и по завершении вызовут делегат обратного вызова. Таким образом, вы можете делать все свои вычисления, пока ждете