c# - ShowDialog 中的 Catel async wait 命令 - 死锁

标签 c# mvvm task-parallel-library async-await catel

使用 С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/

相关文章:

c# - 将 ObservableCollection 过滤到多个列表框

c# - 有什么理由在 C# 中编写 "private"关键字吗?

c# - 使用 C# 泛型的助手

c# - 错误 1001。指定的服务已经存在。无法删除现有服务

c# - 将任务与反射(reflection)相结合

c# - 取消对 SSRS 的长时间运行的异步 WCF 调用

.net - 在 .net 4.5 中并行化 for 循环

c# - 线程返回值问题

wpf - 使用 MVVM 是从 View 模型添加控件以包装面板的好习惯吗?

c# - Xceed DataGrid 设置为行 :MultiSelect - How to bind selected row to its MVVM row data