C#:我可以最小化BackgroundWorker中运行的应用程序吗;更新UI
本文关键字:应用程序 更新 UI 运行 我可以 最小化 BackgroundWorker | 更新日期: 2023-09-27 18:27:31
我有一个backgroundWorker线程正在运行。在最后我更新了用户界面,最小化应用程序&更改图标。
我试图在中间最小化应用程序,但随后UI没有更新,图标也没有更改。线程已执行,但此部分未完成。
最小化应用程序时无法更新UI吗?如果可以的话,我可能会出错。
更新:
@Daniel,是的,我知道。当任务完成时,我调用ProgressChanged,最后也调用RunWorkerCompleted。但是当我最小化中间的应用程序时,像Label这样的组件不会改变。按钮文本已更改,但挂起/卡住-按钮不再工作。我的观点是:如果应用程序在执行DoWork时最小化,那么当ProgresChanged&是否调用了RunCompleted。如果调用,那么为什么某些组件没有更改。注意:如果我不在中间最小化,那么一切都很好。
您只能从UI线程更新UI。ProgressChanged
和RunWorkerCompleted
事件在UI线程上运行,而DoWork
事件则不是。这意味着,如果您想在BackgroundWorker
运行时从它更新UI,则需要在ProgressChanged
事件处理程序中进行更新。
您使用的是WPF还是Winforms?在任何情况下,如果你想对UI做点什么,你必须回到UI线程。
为此,在WPF中,您可以使用dispatcher对象,并对其进行调用,因此该方法将由UI线程执行,而不是由工作线程执行。在Winforms中,您必须维护对某个UI控件的引用,并对该控件进行调用。
考虑以下代码片段(WPF):
if (!myCheckBox.Dispatcher.CheckAccess())
{
myCheckBox.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
myCheckBox.IsChecked = true;
}
));
}
else
{
myCheckBox.IsChecked = true;
}
以下是我在Winforms中使用的另一个代码片段,用于从UI线程引发事件
Friend Shared Sub RaiseUiEvent(ByVal hnd As EventHandler, ByVal sender As Object, ByVal e As EventArgs)
Dim uiRef = GlobalManager.GetInstance().UI
Try
uiRef.BeginInvoke(hnd, sender, e)
Catch ex As InvalidOperationException
''if UiRef is null, then we simply drop the event
Logger.AddTextToLog(ex)
Debug.WriteLine("Invalid operation in raiseUiEvent")
Catch ex As NullReferenceException
Logger.AddTextToLog(ex)
Debug.WriteLine("Null Reference in RaiseUiEvents")
End Try
End Sub