【发布时间】:2015-08-06 07:29:23
【问题描述】:
我尝试在我的编码中使用async 和await,同时我将大量数据从我的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