簡體   English   中英

使用Background Worker時失去UI功能

[英]Losing UI functionality while using the Background Worker

我對使用不同的線程和使用BackgroundWorkerBackgroundWorker ,所以我還沒有完全了解所有內容。 我已經從下面程序的客戶端發布了所有的編碼。

我遇到的問題是,即使我使用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;
    }
}

編輯:我也從我的編碼方法中刪除了asyncawait ,但數據似乎仍然沒有通過。

我在這里添加了一個斷點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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM