WPF ViewModel AsyncCommand 冻结整个 UI

WPF ViewModel AsyncCommand Freeze whole UI

提问人:Rich 提问时间:9/18/2023 最后编辑:Rich 更新时间:9/19/2023 访问量:91

问:

我正在开发一个简单的应用程序,该应用程序具有负责通过 MediatR 加载数据的单个数据网格。为了便于在单击按钮时进行数据刷新,我实现了一个 AsyncCommand,从一篇特定文章中汲取灵感。但是,在触发 refreshBtnCommand 时,我遇到了一个问题,即每次重新加载数据或在不同页面之间交换时,整个 UI 都会冻结几秒钟。我不确定这个问题的根源,非常感谢任何解决方案或指导来纠正它。

public class MainPageViewModel : BindableBase
{
    public IAsyncRelayCommand DownloadTextCommand { get; private set; }
    private readonly IRepositoryManager _RepositoryManager;
    public MainPageViewModel(IRepositoryManager RepositoryManager)
    {
        RefreshBtnCommand = new AsyncRelayCommand(runTest);
    }
    public async Task runTest()
    {
            await Task.Run(() => {
                int i = 0;
                while (true) {
                    if (i++ == int.MaxValue) break;
                }
            });
    
            await _RepositoryManager.TestRepository.Test();
    }
}

Xaml

<Grid>
  <Button x:Name="button" Command="{Binding DownloadTextCommand}"/>
</Grid>

存储 库

public class TestRegisterRepository : ITestRegisterRepository
{
    private new readonly ModelContext _modelContext;
    public TestRegisterRepository (ModelContext repositoryContext)
    {
        _modelContext = repositoryContext;
    }

    public async Task<List<DataTable>> Test() {
        return await Task.Run(() => this._modelContext.DataTable.Take(1000).ToListAsync());
//return await this._modelContext.DataTable.Take(1000).ToListAsync(); //Freeze UI
    }
}
C# .NET WPF 异步 async-await

评论

0赞 Stephen Cleary 9/18/2023
你能发布一个最小的可重现示例,即其他人可以在调试器中运行的东西吗?
0赞 Rich 9/19/2023
@StephenCleary当然。我已将我的帖子更新为一个简化的示例。我认为只需添加 EF 核心上下文即可重现。我终于发现,如果我在 runTest 中注释掉“await _RepositoryManager.TestRepository.Test()”,UI 运行良好,没有冻结。但是,如果保留它,即使我在TestRegisterRepository.Test方法中使用ToListAsync(),它也会冻结整个UI。
1赞 Rich 9/19/2023
Oracle 12c 和 Oracle.EntityFrameworkCore 7.21.11 nuget 包
1赞 Stephen Cleary 9/19/2023
上次我检查时,Oracle 不支持异步 EF 查询。因此,您需要将包装作为解决方法。您可以通过捕获返回的 from 并查看是否曾经 来相当容易地验证这一点。我怀疑它总是如此(即,即使您调用异步 API,Oracle 也始终同步运行)。Task.RunTaskToListAsyncIsCompletedfalsetrue
1赞 Andy 9/20/2023
stackoverflow.com/questions/29016698/......

答: 暂无答案