【问题标题】:Task locking UI in WPFWPF 中的任务锁定 UI
【发布时间】:2016-04-12 07:32:00
【问题描述】:

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

  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;
        }
    }

【问题讨论】:

  • LoadWork() 是从 UI 线程调用的吗?是什么导致此方法被调用? DataEntities的构造函数需要多少时间?里面有什么特别的吗?
  • 是 LoadWork 从 UI 线程调用。它是从视图模型的构造函数中调用的。 ` public FutureWorkViewModel(IDataService dataService) { _dataService = dataService;负载工作(); }` 数据实体的构造函数需要 145 毫秒,所以我觉得这可能不是罪魁祸首。
  • 你需要等待 LoadWork();还有
  • @axlj 是对的,你必须一直使用asyncawait 才能真正实现异步。但是,你不能将构造函数声明为async(这样你就可以在其中await)所以你最好explore some other options
  • 一般来说,在构造函数中调用async方法不是一个好主意,因为对象将在async方法完成之前被构造。但是,这并不能解释为什么应用程序停止响应。也许DataEntities 的构造函数需要很多时间?请注意new DataEntities() 将在 UI 线程上运行。

标签: c# wpf mvvm task


【解决方案1】:

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

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

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

然后把它挂起来:

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

编辑:

如果您更愿意坚持使用 MVVM 模式,可以发布替代解决方案 here

【讨论】:

  • 感谢您,请参阅我上面提供的链接。我实现了类似的修复,同时仍然保持 MVVM 设计模式。
  • 啊完美。与我提议的方式相比,我绝对更喜欢这种方式。谢谢!
  • 我更新了我的答案以包含您提到的链接,这样其他人就不需要通过 cmets 挖掘来找到它。
猜你喜欢
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
相关资源
最近更新 更多