WPF中的任务锁定UI

本文关键字:锁定 UI 任务 WPF | 更新日期: 2023-09-27 18:29:29

我最近一直在尝试学习在WPF中使用Task的过程,但遇到了一个障碍,很可能是因为我缺乏经验。当执行对我的数据服务方法"GetFutureWork"的异步调用时,UI线程变得没有响应。代码如下所示。注意,这个项目使用MVVM,变量"WorkList"只是一个可观察的集合,用于我的listiview的项目源。

  private async void LoadWork()
    {
        WorkList = await _dataService.GetFutureWork("UserNameHere");
    }

数据服务任务

public async Task<IEnumerable<FutureWork>> GetFutureWork(string userName)
    {
        using (_db = new DataEntities())
        {
            var workList = await (from items in _db.REPAIR_CHECK_IN_TABLEs
                where items.LOCATION == userName && items.COMPLETED == "N"
                select new FutureWork
                {
                    FormattedDate = items.EstShipDate.ToString(),
                    ServiceID = items.SERVICE_ID,
                    ImagePath = @"''192.168.5.50'photos$'" + items.SERVICE_ID + "P1.bmp",
                    Priority = items.PRIORITY
                }).ToListAsync();
            return workList;
        }
    }

WPF中的任务锁定UI

您不能从窗口构造函数调用异步函数,因此正如其他人所提到的,您需要另一种方法。

您可以使用Window_Loaded事件而不是构造函数。

private async void Window_Loaded(object sender, RoutedEventArgs e)
{
    await LoadWork();
}

然后连接:

<Window x:Class="AsyncWindow.MainWindow" ... Loaded="Window_Loaded">

编辑:

如果您更愿意坚持MVVM模式,这里会发布一个替代解决方案。