【发布时间】:2016-10-12 20:39:37
【问题描述】:
我有如下代码,我面临 UI Hung 问题,没有直接的方法来重现它。它随机发生 10 次。我无法确定导致问题的原因。
我有下面的按钮点击代码,它将显示一个子窗口:-
private void processCart_Click(object sender, RoutedEventArgs e)
{
// processcart is Child Window Like Dialog To Open on Top Of Main Window
processcart = new ProcessCart();
processcart.Closed += ProcessCart_OnClosed;
// Disable Parent Window
this.Dispatcher.Invoke(new Action(() =>
{
try
{
this.IsEnabled = false;
}
catch (Exception ex)
{ }
}));
processcart.Owner = Window.GetWindow(this);
// Openning Child Window
processcart.Show();
}
private void ProcessCart_OnClosed(object sender, EventArgs e)
{
// On Child Window Close Doing some UI Update on Main Window
totalChangeAmount.Dispatcher.Invoke(new Action(() =>
{
try
{
totalChangeAmount.Text = XFuelMath.roundingTwo(cart.ChangeTotal) + "";
}
catch
{ }
}));
// Starting Background Worker Thread for Database operation.
if (!bgwTransaction.IsBusy)
{
bgwTransaction.RunWorkerAsync(cart);
}
}
private void bgwTransaction_DoWork(object sender, DoWorkEventArgs e)
{
// Doing some database operation but no UI Operation
// I dont know if i can call task inside background worker.
Task.Run(() => DeleteCurrentTicketDataFromDB(dataList, false));
// Calling another background worker inside it
if (!bgwPrintRecipt.IsBusy)
{
bgwPrintRecipt.RunWorkerAsync();
}
}
private void bgwPrintRecipt_DoWork(object sender, DoWorkEventArgs e)
{
// Sending Data to printer
}
private void bgwPrintRecipt_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// No Ui Operation Here
}
private void bgwTransaction_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Some UI Operation
totalSurcharge.Dispatcher.Invoke(() =>
{
totalSurcharge.Text = "0";
});
saleNumber.Dispatcher.Invoke(() => { });
saleDataGrid.Dispatcher.Invoke(new Action(() =>
{
try
{
saleDataGrid.ItemsSource = currentSharedTicketCollection;
saleDataGrid.Items.Refresh();
if (isautoscroll && item!=null)
{
saleDataGrid.ScrollIntoView(item, saleDataGrid.Columns[0]);
saleDataGrid.SelectedItem = item;
}
}
}));
// Enable the parent window Again
this.Dispatcher.Invoke(new Action(() =>
{
try
{
this.IsEnabled = true;
}
catch (Exception ex)
{ }
}));
}
我不确定我是否在内部调用 BackgroundWorker DoWork 和 RunWorkerCompleted。
请指导我在此代码中需要更改什么?
【问题讨论】:
-
我首先要摆脱所有空的 catch 块
-
我在 catch 块中有一些日志记录代码,所以我在发布时删除了它。使代码更短。
-
混用BackgroundWorker和Task.Run只会让人头疼,二选一吧。
标签: c# wpf backgroundworker