У меня Windows svc, который работает асинхронно (я отредактировал методы и их параметры, чтобы сделать их асинхронными), немного похоже на: http://msdn.microsoft.com/en-us/library/ms731177.aspx
Однако я вызываю задачу, которую хочу запустить асинхронно (вызов службы / сервера), а затем обновляю пользовательский интерфейс (используя ReportProgress () на backgroundworker - все это происходит в методе dowork () фонового работника). Однако я вызываю метод Endxxx для получения результатов, но проблема в том, должен ли мой код выглядеть?
while (!asyncresult.IsCompleted) { // Do all UI updating etc here... }
// Call endXXX here.
Однако этот подход блокирует пользовательский интерфейс. На данный момент мой код выглядит примерно так (и не блокирует интерфейс):
IAsyncResult res = null;
try
{
res = serviceX.BeginXXX(ResultCallBack, "");
}
catch (FaultException<ManagementException> managementEx)
{
Logger.Error(managementEx.Detail.ToString());
MessageBox.Show("Could not add printer. See log.");
}
InstallBackgoundWorker.ReportProgress(90);
InstallBackgoundWorker.ReportProgress(91);
InstallBackgoundWorker.ReportProgress(93);
InstallBackgoundWorker.ReportProgress(94);
InstallBackgoundWorker.ReportProgress(95);
InstallBackgoundWorker.ReportProgress(96);
InstallBackgoundWorker.ReportProgress(97);
if (res.IsCompleted)
{
ResultCallBack(res);
}
InstallBackgoundWorker.ReportProgress(100);
Это правильно? Мне кажется, это неправильно.