【发布时间】:2015-08-05 09:44:06
【问题描述】:
我对使用不同的线程和使用BackgroundWorker 很陌生,所以我还没有完全理解所有内容。我已经发布了我从下面程序的客户端获得的所有编码。
问题是,即使我使用 BackgroundWorker,当我从 WCF 服务加载数据时,我仍然会失去所有 UI 的功能到我的 WPF 客户端应用程序。加载数据大约需要 2-3 分钟(大约 +- 1500 行数据),因此用户体验非常糟糕。
在将数据加载到datagrid 时,我可能缺少什么明显的东西来使 UI 正常工作?任何建议将不胜感激,谢谢! :)
更新代码:
public partial class pgSysproStock : Window
{
public pgSysproStock()
{
InitializeComponent();
SysproStock.WindowState = WindowState.Normal;
dgSysproStock.IsEnabled = false;
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.WorkerReportsProgress = true;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerAsync();
}
private readonly BackgroundWorker worker = new BackgroundWorker();
private async void worker_DoWork(object sender, DoWorkEventArgs e)
{
using (TruckServiceClient TSC = new TruckServiceClient())
{
List<AllStock> allStock = new List<AllStock>();
this.Dispatcher.Invoke((Action)(() =>
{
prgStockProgress.Visibility = Visibility.Visible;
}));
foreach (var item in await TSC.GetSysproStockAsync())
allStock.Add(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
});
e.Result = allStock.ToArray();
}
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.prgStockProgress.Value = e.ProgressPercentage;
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
dgSysproStock.ItemsSource = (AllStock[])e.Result;
dgSysproStock.IsEnabled = true;
}
}
编辑:我还从我的编码方法中删除了async 和await,但数据似乎仍然没有通过。
我在此处添加了一个断点:foreach (var item in await TSC.GetSysproStockAsync()),但我无法通过TSC.GetSysproStock()) 代码。为什么要这样做?
【问题讨论】:
-
这是阻止您的 UI 的操作:
dgSysproStock.ItemsSource = (allStock.ToArray());。 -
您不能将 async/await 与后台工作人员混合使用。
worker_DoWork不能是异步的。我想说扔掉 BGW 并单独使用 async await。 -
乍一看,在 BackgroundWorker 中使用 async/await 似乎是错误的。
-
@Sriram Sakthivel - 感谢您的评论! :) 如果我删除
BackgroundWorker我将无法使用我的 UI,因为当我从 WCF 服务加载数据时它会被禁用。 -
如果你正确使用了 async/await,就不需要 BackgroundWorker。 await 关键字导致方法执行被拆分到多个线程中,方法的其余部分充当回调。
标签: c# wpf multithreading wcf backgroundworker