我想在C#中使用线程或后台工作者向列表框添加一些项目。但是当我在一个循环中调用addlist
函数时,我的程序暂时没有响应。我该如何解决这个问题?
这是我的代码:
public delegate void addToList(string st);
public void addlist(string st)
{
if (listBox1.InvokeRequired)
{
listBox1.Invoke(new addToList(addlist), st);
}
else
{
listBox1.Items.Add(st);
}
}
答案 0 :(得分:2)
我假设您的.InvokeRequired
/ Invoke(...)
代码使用WinForms而非WPF。
BackgroundWorker
将调用主线程上的ProgressChanged
和RunWorkerCompleted
事件(假设您在该线程上创建了worker)。如果您要在其中任何一项活动中向ListBox
添加项目,则不应要求Invoke()
。
如果您要快速向ListBox.Items
集合中添加项目,建议您使用ListBox.BeginUpdate()
和ListBox.EndUpdate()
,这将暂时暂停重新绘制ListBox
添加项目。当您在几秒钟内向ListBox
添加数百或数千个项目时,此功能非常有用。
例如:
void ReloadListBox()
{
listBox.BeginUpdate(); // Suspend redrawing
listBox.Items.Clear(); // Remove all existing items first
backgroundWorker.RunWorkerAsync(); // Asynchronous generate new items
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Report a new list item in e.UserState.
var newItem = e.UserState;
listBox.Items.Add(newItem);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Alternatively, return a list of items in e.Result.
var items = e.Result;
listBox.Items.AddRange(items);
listBox.EndUpdate(); // Resume redrawing and update
}
答案 1 :(得分:1)
你可以这样做..
private delegate void Update();
public void addlist(string st)
{
listBox1.Invoke(new Update(() => listBox1.Items.Add(st)));
}
答案 2 :(得分:0)
我并不确定我理解你的问题,但试试
Application.Current.Dispatcher.Invoke((Action)(() =>
{
//listBox1..... do whatever you want.
}));