在同步函数中等待

本文关键字:等待 函数 同步 | 更新日期: 2023-09-27 18:08:19

是的,我没有找到任何关于这个话题的报道,所以我想在这里试一试。我试图在一个现有的函数中添加一个加载动画,它返回一个字符串列表。我的代码是这样的:

IoC.Get<IEventAggregator>()
         .PublishOnUIThread(new ShowWaitingAnimationArgs
         {
             DisplayMessage = "Updating database file...",
             ShowWaitingAnimation = true
         });
     Task.Factory.StartNew(() =>
     {
         ResultList = update.HandledDifferences(testContext, realContext, imo);
         IoC.Get<IEventAggregator>()
             .PublishOnUIThread(new ShowWaitingAnimationArgs {ShowWaitingAnimation = false});
     });
     return ResultList;

国际奥委会[…调用基本上只是发送给框架的消息,它启用和禁用加载动画。实际的工作在update中完成。HandledDifferences函数,它基本上更新我的数据库文件并返回可能发生的错误列表。现在我想计算HandledDifferences并在计算时显示加载动画(这样UI线程和这个线程都不会被阻塞),完成后,我想返回结果,基本上是代码中写的东西。然而,因为它是异步的,它甚至不等待我的ResultList被计算出来,它只是返回当时在那里的值。

我已经尝试调用任务的返回值并等待任务,其中两种选项最终阻塞UI线程(任务)。等待有时甚至会阻塞任务本身,所以它永远不会完成,我从来没有超过那一行)。

我现在几乎没有主意了。我只是想等待任务完成,但我不能这样做,因为它不是一个异步方法,它不能被做成一个(它必须实现一个接口)。有什么办法吗?诚然,我没有真正的异步编程经验,但我在任何地方都找不到这样的东西。

在同步函数中等待

如果使用async-await,在UI线程上调用Wait()或Result会导致UI线程死锁。

您没有发布代码所属或调用代码的方法签名,但我认为这将工作:

async Task DoWorkAsync()
{
    IoC.Get<IEventAggregator>()
         .PublishOnUIThread(new ShowWaitingAnimationArgs
         {
             DisplayMessage = "Updating database file...",
             ShowWaitingAnimation = true
         });
    var resultList = await Task.Run(
        () => update.HandledDifferences(testContext, realContext, imo));
    IoC.Get<IEventAggregator>()
        .PublishOnUIThread(new ShowWaitingAnimationArgs {ShowWaitingAnimation = false});
    return ResultList;
}

你可以使用AsyncBridge,它将允许你执行异步方法而不阻塞UI线程。

IoC.Get<IEventAggregator>()
         .PublishOnUIThread(new ShowWaitingAnimationArgs
         {
             DisplayMessage = "Updating database file...",
             ShowWaitingAnimation = true
         });
    using (var A = AsyncHelper.Wait)
    {
        A.Run(Task.Run( () => update.HandledDifferences(testContext, realContext, imo)), res => ResultList = res);
    }
    IoC.Get<IEventAggregator>()
             .PublishOnUIThread(new ShowWaitingAnimationArgs {ShowWaitingAnimation = false});
     return ResultList;