【发布时间】:2015-01-06 00:19:15
【问题描述】:
我尝试在另一个后台线程中执行一项简单的任务,因此 UI 不会被阻塞,但它仍然会被阻塞。我是不是忘了什么?
public partial class backgroundWorkerForm : Form
{
public backgroundWorkerForm()
{
InitializeComponent();
}
private void doWorkButton_Click(object sender, EventArgs e)
{
if (backgroundWorker.IsBusy != true)
{
// Start the asynchronous operation.
backgroundWorker.RunWorkerAsync();
}
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//BackgroundWorker worker = sender as BackgroundWorker;
if (textBoxOutput.InvokeRequired)
{
textBoxOutput.Invoke(new MethodInvoker(delegate
{
for (int i = 0; i < 10000; i++)
{
textBoxOutput.AppendText(i + Environment.NewLine);
}
}));
}
}
}
当文本框被填满时,用户界面被阻塞:
【问题讨论】:
-
难怪,你有循环在你的 Invoke 中完成工作(在 UI 线程上被调用)
-
您的后台工作人员唯一要做的就是将整个循环分派到 UI 线程并在那里执行。
-
textBoxOutput.Invoke将在 UI 线程中同步执行委托,因此它会阻塞。目前尚不清楚您要实现什么目标,但显然您根本不需要BackgroundWorker。 -
我认为您需要将后台工作处理和 UI 更新分开。为什么不能使用 OnRunWorkerCompleted 进行 UI 更新?
-
一个想法是在内存中生成字符串并更新一次到
TextBox。这会表现得更好,但在不知道你想要实现什么的情况下很难回答。
标签: c# winforms backgroundworker