有一个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);
}
第一种我感觉和不使用多线程差不多,而第二种呢,说不出来,大家怎么看这个问题
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);
}
第一种我感觉和不使用多线程差不多,而第二种呢,说不出来,大家怎么看这个问题
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);
上面一位老兄的代码里就是这样判断是的
if( InvokeRequired ) //此代码用于判断是否在主线程中运行相应的代码