【发布时间】:2015-06-19 02:38:33
【问题描述】:
我有一个 Singleton(好吧,它可以是一个静态类,没关系),它是我的 WPF 应用程序的一些数据的外观。我想通过 WCF 异步加载这些数据。这是我的实现:
public class Storage
{
private static readonly Lazy<Storage> _lazyInstance = new Lazy<Storage>(()=>new Storage());
public static Storage Instance
{
get { return _lazyInstance.Value; }
}
private Storage()
{
Data = new Datastorage(SettingsHelper.LocalDbConnectionString);
InitialLoad().Wait();
}
public Datastorage Data { get; private set; }
private async Task InitialLoad()
{
var tasks = new List<Task>
{
InfoServiceWrapper.GetSomeData()
.ContinueWith(task => Data.StoreItem(task.Result)),
InfoServiceWrapper.GetAnotherData()
.ContinueWith(task => Data.StoreItem(task.Result)),
InfoServiceWrapper.GetSomeMoreData()
.ContinueWith(task => Data.StoreItem(task.Result)),
};
await Task.WhenAll(tasks.ToArray());
}
}
我像这样从我的 ViewModel 访问这个类:
public class MainWindowViewModel:ViewModelBase
{
public SensorDTO RootSensor { get; set; }
public MainWindowViewModel()
{
var data = Storage.Instance.Data.GetItem<SensorDTO>(t=>t.Parent==t);
RootSensor = data;
}
}
在我看来,我有一个 RootSensor 的绑定。一切都很好,但我有一个问题:我所有的异步代码都执行了,然后我在 InitialLoad().Wait(); 上遇到了死锁。我知道它以某种方式涉及 WPF UI 线程,但不明白如何解决这个问题。
如有任何帮助,我将不胜感激!
【问题讨论】:
-
我现在没有时间给出完整的答案,但是这两个资源应该会有所帮助:blog.stephencleary.com/2012/07/dont-block-on-async-code.htmlblogs.msdn.com/b/pfxteam/archive/2011/01/15/10116210.aspx
-
@johnnymumble 很好,我想我理解这些论文中显示的内容,但我不知道如何在我的 ViewModel 构造函数中正确等待。我是使用 SynchronizationContext 还是以某种方式调度?
标签: c# wpf wcf asynchronous async-await