让我们从代码开始:
private void StartStopService()
{
var task = Task.Run(() => debugService.Iterate());
StartStopInit(true);
//task.Wait();
if (task.IsCompleted)
StartStopInit(false);
}
我正在尝试创建一个程序,它将逐个执行DB中给定DLL的列表而不会阻塞UI线程。提供的方法是在按钮单击时运行的,它正在开始迭代DLL的任务。
public void Iterate()
{
foreach (var plugin in runningPlugins)
ExecutePlugin(plugin);
}
执行方法只是逐个执行DLL。
我需要一个解决方案来在所有DLL完成执行后运行StartStopInit()
方法。如果我放task.Wait()
我将阻止UI ...情况,因为它现在当然不起作用,因为如果条件在任务开始时通过。如果我实现某种无限循环来监听更改,我将再次阻止UI。我该如何解决这个问题?
答案 0 :(得分:4)
如果可以,您应该转到新的async/await
关键字和周边支持。
对于您问题中的特定代码,请按以下步骤操作:
async Task
,以明确调用此方法为异步的代码await
来暂停执行,然后等待"在继续之前完成任务具体来说,这就是它的样子:
private async Task StartStopService()
{
StartStopInit(true);
await Task.Run(debugService.Iterate);
StartStopInit(false);
}
时间方面我会向周围的代码发出信号,表示该方法在生成子任务之前正在执行。
还考虑添加try / catch块,如果子任务抛出异常会发生什么?
private async Task StartStopService()
{
try
{
StartStopInit(true);
await Task.Run(debugService.Iterate);
}
catch (InvalidOperationException ex)
{
// What to do here???
}
finally
{
StartStopInit(false);
}
}