【问题标题】:Unresponsive UI while using Async & Await使用 Async & Await 时 UI 无响应
【发布时间】:2015-08-06 07:29:23
【问题描述】:

我尝试在我的编码中使用asyncawait,同时我将大量数据从我的WCF 服务传输到我的WPF 客户端应用程序。现在加载数据确实需要大约 2-3 分钟,但现在我的 UI 在总时间 无响应 时遇到了困难。它不是很用户友好。有没有办法让我的 UI 在使用我目前拥有的编码加载数据时做出响应?

public pgSysproStock()
{
    InitializeComponent();
    SysproStock.WindowState = WindowState.Normal;
    this.UpdateStockAsync();
}

private async void UpdateStockAsync()
{
    dgSysproStock.IsEnabled = false;

    using (TruckServiceClient TSC = new TruckServiceClient())
    {
        var allStock = await TSC.GetSysproStockAsync();

        dgSysproStock.ItemsSource = allStock.Select(item =>
                    new AllStock
                    {
                        Id = item.Id,
                        StockCode = item.StockCode,
                        Description = item.Description,
                        ConvFactAltUom = item.ConvFactAltUom,
                        ConvMulDiv = item.ConvMulDiv,
                        ConvFactOthUom = item.ConvFactOthUom,
                        MulDiv = item.MulDiv,
                        Mass = item.Mass,
                        Updated_Supplier = item.Updated_Supplier,
                        CycleCount = item.CycleCount,
                        ProductClass = item.ProductClass.ToString(),
                        UnitCost = item.UnitCost,
                        Discount = item.Discount,
                        Warehouse = item.Warehouse,
                        MinimumStock = item.MinimumStock,
                        MaximumStock = item.MaximumStock,
                        StockForNow = item.StockForNow,
                        CoilWidth = item.CoilWidth,
                        SheetCoilLength = item.SheetCoilLength,
                        MaterialThickness = item.MaterialThickness
                    }).ToArray();

        dgSysproStock.IsEnabled = true;
    }
}

感谢您的建议! :D

【问题讨论】:

  • 如果花了这么长时间,出了点问题。。为什么不把数据分成小块,而不是同时加载所有数据?
  • 我不知道 wpf / wcf 是如何工作的,但显然有两个错误:1)当你调用它时,你不是在 awaitng UpdateStockAsync(),2)你正在调用一个异步方法从 ctor 内部(无论如何,这使得等待它是不可能的)。
  • @DiogoCunha - 谢谢你的评论! ;) 我正在加载大约 1500 行数据。我从来没有在不同的块中加载过一张桌子。你能给我一个链接或例子来说明我该怎么做吗?
  • 1500 行并没有我预期的那么多.. 1M 行需要 2 3 分钟.. 你知道如何使用 Visual Studio 分析吗?
  • @CareTaker22 我想你误解了我的意思。你不能从构造函数中等待异步方法,所以显然不应该从内部调用UpdateStockAsync()你的构造函数。您可以决定使UpdateStockAsync() 同步而不是异步,但这将是一个错误。相反,重构您的代码,以便从另一个地方调用UpdateStockAsync(),在那里可以等待它。也就是说,您的时间问题与您对 async / await (TMO) 的使用无关。我会接受@DiodoChuna 的建议来衡量您的数据库响应所需的时间。

标签: c# wpf wcf asynchronous


【解决方案1】:

您的操作似乎启动操作不正确。 我建议您为您的窗口创建处理程序 On Load 或其他一些事件,将其标记为异步并从那里进行调用。应该很简单:

private async void Form1_Load(object sender, EventArgs e)
{
    dgSysproStock.IsEnabled = false;

    using (TruckServiceClient TSC = new TruckServiceClient())
    {
        var allStock = await TSC.GetSysproStockAsync();

        dgSysproStock.ItemsSource = allStock.Select(item =>
                        new AllStock
                        {
                           ...
                        }).ToArray();

        dgSysproStock.IsEnabled = true;
    }
}

请注意,我使用的是 Form.Load 事件,但您可以使用不同的事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2017-10-26
    • 2016-02-08
    相关资源
    最近更新 更多