使用线程在C#中将项添加到列表框中

时间:2013-12-30 20:14:10

标签: c#

我想在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);
        }
    }

3 个答案:

答案 0 :(得分:2)

我假设您的.InvokeRequired / Invoke(...)代码使用WinForms而非WPF。

BackgroundWorker将调用主线程上的ProgressChangedRunWorkerCompleted事件(假设您在该线程上创建了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.
}));

另请阅读http://msdn.microsoft.com/en-us/library/ms741870.aspx