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有时甚至会阻止任务本身,所以它永远不会完成,我从来没有过去那条线。)
我现在几乎没有想法。我只是想等待完成任务,但我不能这样做,因为它不是一个异步方法,它不能组成一个(它必须实现一个接口)。任何想法如何做到这一点?不可否认,我并不是真正的异步编程经验,但我无法在任何地方找到类似的东西。
答案 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;