等待同步功能?

时间:2015-08-15 21:41:14

标签: c# asynchronous async-await

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

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;

IoC [...]调用基本上只是发送到框架的消息,它启用然后禁用加载动画。实际工作是在update.HandledDifferences函数中完成的,它基本上更新了我的数据库文件并返回可能出现错误的列表。 所以现在我想计算HandledDifferences并在计算时显示加载动画(因此UI线程和此线程都没有被阻止),并且在完成之后,我想返回结果 - 几乎那段代码写的是什么。 但是,由于它是异步的,它甚至不会等待我的ResultList计算,它只返回当时在那里的值。

我已经尝试调用任务的返回值并等待任务,其中两个选项最终阻止了UI线程(Task.wait有时甚至会阻止任务本身,所以它永远不会完成,我从来没有过去那条线。)

我现在几乎没有想法。我只是想等待完成任务,但我不能这样做,因为它不是一个异步方法,它不能组成一个(它必须实现一个接口)。任何想法如何做到这一点?不可否认,我并不是真正的异步编程经验,但我无法在任何地方找到类似的东西。

2 个答案:

答案 0 :(得分:0)

如果使用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;
}

答案 1 :(得分:0)

您可以使用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;