有一个combox控件,要在里面填充从1到60000的数就是
combox.Items.Add(1);
combox.Items.Add(2);
combox.Items.Add(3);
........
combox.Items.Add(60000);如果不用多线程,界面会就假死的现象,如果使用如下多线程,大家觉得哪种方法好,或是有更好的办法第一种:
Thread th=new Thread(new ThreadStart(FillCombox));
th.Start();private void FillCombox()
{
   this.BeginInvoke(new DelegateCombox(LoadData));  //在线程里使用异步调用更新页面上的控件
}private delegate void DelegateCombox();private void LoadData()
{
    for (int i=1;i<=60000;i++)
    {
      combox.Items.Add(i);
     }
}第二种:
Thread th=new Thread(new ThreadStart(FillCombox));
th.Start();private void FillCombox()
{
   for (int i=1;i<=60000;i++)
    {
       //在线程里使用异步调用更新页面上的控件
       this.BeginInvoke(new DelegateCombox(LoadData),new objects[]{i});      
     }
}private delegate void DelegateCombox(int i);private void LoadData(int i)
{
     combox.Items.Add(i);
}
第一种我感觉和不使用多线程差不多,而第二种呢,说不出来,大家怎么看这个问题

解决方案 »

  1.   

    this.BeginInvoke(new DelegateCombox(LoadData));  辅线程里调用这句,是更新主界面上的控件,那个这个是不是在主线程上执行的,如果是那么还是会出现假死现象
      

  2.   

    我感觉要填这么多数还不如用textBox自输省事,大不了加个验证
      

  3.   

    private SortedList sl = null;
    private const int  TEST_COUNT = 10000; private void button1_Click(object sender, System.EventArgs e)
    {
    mi = new MethodInvoker(DoWork);
    mi.BeginInvoke(new AsyncCallback(DoneWork), null);
    }
    private void DoWork()
    {
    sl = new SortedList();
    InitialPB(TEST_COUNT);
    for (int i =0;i<TEST_COUNT;i++)
    {
    sl.Add(i,"noway8881" + i.ToString());
    Thread.Sleep(100);
    RefreshText("noway8881" + i.ToString());
    RefreshPB(1);
    }

    }
    private void InitialPB(int max)
    {
    if( InvokeRequired )
    {
    this.Invoke( new IntDelegate(InitialPB), new object [] { max } );
    return ;
    } progressBar1.Maximum = max ;
    progressBar1.Value = 0;
    } private void RefreshText(string item)
    {
    if( InvokeRequired )
    {
    this.Invoke( new StringDelegate(RefreshText), new object [] { item } );
    return ;
    } this.textBox1.Text = item;
    } private void RefreshPB(int Value)
    {
    if( InvokeRequired )
    {
    this.Invoke( new IntDelegate(RefreshPB), new object [] {Value} );
    return ;
    } progressBar1.Value+=Value;
    } private void DoneWork(IAsyncResult result)
    {
    if( InvokeRequired )
    {
    Invoke(new AsyncCallback(DoneWork), new Object [] { result } );
    return ;
    }
    MessageBox.Show("Done!");
    } private void button2_Click(object sender, System.EventArgs e)
    {
    mi.EndInvoke(null);
    } private MethodInvoker mi= null; private delegate void IntDelegate(int num);
    private delegate void StringDelegate(string str);
      

  4.   

    在多线程操作中。要注意的一点是的工作线程不能对UI 元素进行操作,如生成一个线程,此线程只能做一些逻辑计算,如果想把计算结果设置到UI元素,则设置这一步必须在主线程中运行。否则就会出现假死现象。你上面的现象并不是60000个对象形成的。
    上面一位老兄的代码里就是这样判断是的
    if( InvokeRequired ) //此代码用于判断是否在主线程中运行相应的代码
      

  5.   

    首先,在一个combobox中填充六万个数字就不是一个好的解决方法。