C#等待任务而不阻止UI

时间:2016-12-06 09:14:20

标签: c# multithreading dll

让我们从代码开始:

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。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

如果可以,您应该转到新的async/await关键字和周边支持。

对于您问题中的特定代码,请按以下步骤操作:

  1. 将方法标记为async Task,以明确调用此方法为异步的代码
  2. 在方法内的任务上使用await来暂停执行,然后等待"在继续之前完成任务
  3. 具体来说,这就是它的样子:

    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);
        }
    }