私は以下のようなコードを持っています。私はUI Hung問題に直面しています。それを再現する直接の方法はありません。その発生は無作為に1回10回起こる。私は問題の原因を特定できません。C#WPF UI Freeze Issue MultiThreading
私は子ウィンドウが表示されますボタンクリックコードの下にあります。 -
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
を行います。 このコードで変更する必要があるものを教えてください。
私はすべての空のキャッチブロックを取り除くことから始めたいと思います。 –
キャッチブロックにいくつかのロギングコードがあるので、投稿中に削除しました。コードを短くする。 –
BackgroundWorkerとTask.Runを混在させるだけで、頭痛の原因になります。どちらか一方を選択してください。 –