【问题标题】:Catel call ShowDialogAsync syncCatel 调用 ShowDialogAsync 同步
【发布时间】:2020-08-11 15:39:35
【问题描述】:

我尝试在同步代码中调用 ShowDialogAsync。我对异步编程不是很熟悉。如果我运行这段代码,我最终会陷入僵局。如果我将 Command 更改为 TaskCommand,它会起作用,但我必须将所有 Code 更改为 async。

    public MainWindow()
    {
        InitializeComponent();
        Abc = new Command(() => Asd());
    }

    public Command Abc { get; set; }

    private void Asd()
    {
        var b = StartDialog(true).GetAwaiter().GetResult();
    }

    private async Task<bool> StartDialog(bool isMultiple)
    {
        await ServiceLocator.Default.ResolveType<IUIVisualizerService>().ShowDialogAsync<PersonVm>(new PersonM());
        return true;
    }

这里我使用了here的答案。 有人可以帮帮我吗?

【问题讨论】:

    标签: catel


    【解决方案1】:

    推荐的方法是将您的代码迁移到异步。 Catel 中的大多数功能都是异步的(例如 vm 初始化等)。一开始它可能会有点不知所措,但是一旦你了解了它的工作原理,这是一种非常方便的编程方式。在同时,您可以使用解决方法(这不是最佳实践,但可以帮助您完成此任务):

        private async void Asd()
        {
            var b = await StartDialog(true);
        }
    

    请注意,不建议使用 async void,除非没有其他可用选项(例如非异步事件处理程序等),否则应该避免使用。

    【讨论】:

    • 我想我最终会尝试迁移到异步。所有其他解决方法似乎都是黑客。问题似乎是在await Dispatcher.BeginInvoke 上调用.GetAwaiter().GetResult()。一个真正的问题是here,这个有用的post 与此相关联。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多