使用 Сatel 库最新版本(3.8.1 beta)。
如何从对话框窗口使用 TAP 方法?
示例。 在主 ViewModel 中调用方法
private bool ShowDialogWindow()
{
var typeFactory = TypeFactory.Default ;
var vm = typeFactory.CreateInstanceWithParametersAndAutoCompletion<LoginWindowViewModel>();
return _uiVisualizerService.ShowDialog(vm) ?? false;
}
在 LoginWindowViewModel 中,我有命令(也可以尝试 AsynchronousCommand),它被称为方法
public async Task<int> Test(string login, string password)
{
var a = await Task<int>.Factory.StartNew(() =>
{
using (var uow = new UnitOfWork<TSDbContext>())
{
var userRep = uow.GetRepository<IUserRepository>();
userRep.GetAll();
return 5;
}
});
a++;
return a;
}
仅当关闭对话框窗口时,我才从等待的方法中获得结果。 线上出现锁
var uow = new UnitOfWork()
ConfigureAwait(false) - 无助于解决问题
当我删除 UnitOfWork 时 - 方法有效
当我将方法代码更改为此时 var d = TypeFactory.Default.CreateInstanceWithParameters(); 返回 5;
阻塞也被复制到 TypeFactory 线上...
根据服务,Catel 不允许出现在对话框中
最佳答案
注意:我编辑了这个答案,因此它包含了这个问题的答案。之前的回答包含了一些提示,供主题发起者调查问题。
您在 MainViewModel 的构造函数中调用该命令。请注意,我们从不建议您在构造函数中调用任何内容。我们有用于此目的的Initialize方法。
原因是您使用 TypeFactory 构造了 MainViewModel (Catel 会为您完成此操作)。然后,在该线程中执行的同一(异步)命令中,您想要实例化一个 UnitOfWork,它也想通过 TypeFactory 实例化一个类型。这是在不同的线程上。 TypeFactory 仍处于锁定状态,因为您仍在构造 MainViewModel。
Catel 再次在 ViewModelBase 上提供了 Initialize 方法,该方法在创建的外部调用,因此在其中执行任何操作都是安全的。请改用它。
关于c# - ShowDialog 中的 Catel async wait 命令 - 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21570466/