[英]Losing UI functionality while using the Background Worker
我對使用不同的線程和使用BackgroundWorker
很BackgroundWorker
,所以我還沒有完全了解所有內容。 我已經從下面程序的客戶端發布了所有的編碼。
我遇到的問題是,即使我使用BackgroundWorker
,在將數據從WCF服務加載到WPF客戶端應用程序時,我仍然會丟失所有UI的功能。 加載數據大約需要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())
代碼。 為什么這樣做呢?
正確使用異步/等待:
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().ToArray();
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;
}
}
這不是應使用BackgroundWorker的方式。 嘗試將數據傳遞到RunWorkerCompleted事件處理程序,然后從那里更新UI。
刪除此:
this.Dispatcher.Invoke((Action)(() =>
{
dgSysproStock.ItemsSource = (allStock.ToArray());
dgSysproStock.IsEnabled = true;
}));
在DoWork事件處理程序中,將Result設置為您的數據:
e.Result = allStock.ToArray();
然后在RunWorkerCompleted事件處理程序中:
dgSysproStock.ItemsSource = (AllSTock[])e.Result;
dgSysproStock.IsEnabled = true;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.