我想写一个方法,将await
的变量设置为true。
下面是psudo代码。
bool IsSomethingLoading = false
SomeData TheData;
public async Task<SomeData> GetTheData()
{
await IsSomethingLoading == true;
return TheData;
}
TheData
将由棱镜事件沿着IsSomethingLoading
变量一起设置。
我调用了GetTheData
方法,但我希望它运行async(现在如果数据没有准备好,它只返回null。(这会导致其他问题。)
有办法做到这一点吗?
5条答案
按热度按时间7vux5j2d1#
在许多情况下,您需要的是
TaskCompletionSource
。您可能有一个方法能够在某个时间点生成数据,但它不使用任务来完成。也许有一个方法接受一个提供结果的回调函数,或者有一个事件被触发来指示有一个结果,或者只是使用一个
Thread
或ThreadPool
的代码,而你不想用Task.Run
来重构。虽然您可能需要/希望将
TaskCompletionSource
提供给worker或其他类,或者以其他方式将其公开到更广泛的范围,但我发现通常不需要它,即使在适当的时候它是一个非常强大的选项。也可以使用
Task.FromAsync
创建基于异步操作的任务,然后直接返回该任务,或者在代码中使用await
返回该任务。t0ybt7op2#
您可以使用TaskCompletionSource作为信号,而
await
:在您的Prism活动中,请执行以下操作:
qvk1mo1f3#
这项工作对我来说:
lbsnaicq4#
最简单的解决方案
afdcj2ne5#
我提出了一个非常简单的解决方案,但不是最好的回答原始问题,如果你不考虑速度性能:
重要提示:@Theodor Zoulias提议:
IsSomethingLoading
应使用volatile
关键字声明,以避免编译器优化和从其他线程访问时潜在的多线程问题。有关编译器优化的更多信息,请参阅本文:The C# Memory Model in Theory and Practice我在下面添加了一个完整的测试代码:
XAML:
测试编码: