代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace MulitiThread
{
public partial class Main : Form
{
private int nMaxThread=5;
private int iRecordCount=0;
private int iLoopCount=0;
private int iThreadCount=0;
public Main()
{
InitializeComponent();
} private void OnStart(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
ThreadStart ThreadProcStart = delegate() { ThreadProc(i, i.ToString()); };
Thread ThreadProcInstance = new Thread(ThreadProcStart);
ThreadProcInstance.Name = "ThreadProcID:" + i;
ThreadProcInstance.IsBackground = true;
ThreadProcInstance.Start();
} /* iRecordCount=ResultlistView.Items.Count;
while(iLoopCount<iRecordCount)
{
while (iThreadCount < nMaxThread && iLoopCount != iRecordCount)
{
ThreadStart ThreadProcStart = delegate() { ThreadProc(iThreadCount, iThreadCount.ToString()); };
Thread ThreadProcInstance = new Thread(ThreadProcStart);
ThreadProcInstance.Name = "ThreadProcID:" + iThreadCount;
ThreadProcInstance.IsBackground = true;
ThreadProcInstance.Start();
iThreadCount++;
iLoopCount++;
}
Thread.Sleep(100);
}*/
} private void ThreadProc(int iID, String strText)
{
String strResult = "The" + iID + "Result";
bool UpdataState;
if(this.InvokeRequired)
{
SetListViewCall UpdataCall=new SetListViewCall(SetListView);
UpdataState=(bool)this.Invoke(UpdataCall,new Object[]{iID,strResult});
}else{
UpdataState=SetListView(iID,strResult);
}
///iThreadCount--;
///System.Threading.Thread.CurrentThread.Abort();
} private delegate bool SetListViewCall(int dIndex,String dName); private bool SetListView(int iIndex, String strText)
{
ResultlistView.Items[iIndex].SubItems.Add(strText);
ResultlistView.Refresh();
return true;
} private void Main_Load(object sender, EventArgs e)
{
ResultlistView.Columns.Add("ID");
ResultlistView.Columns.Add("String");
for (int i = 0; i < 100; i++)
{
ResultlistView.Items.Add(i.ToString());
}
}
}
}程序就一个listview和按钮为什么用for循环创建的多线程可以给ResultListView添加上数据,而While循环就是不行呢?求高手解,或者有比较好的变通方法?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace MulitiThread
{
public partial class Main : Form
{
private int nMaxThread=5;
private int iRecordCount=0;
private int iLoopCount=0;
private int iThreadCount=0;
public Main()
{
InitializeComponent();
} private void OnStart(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
ThreadStart ThreadProcStart = delegate() { ThreadProc(i, i.ToString()); };
Thread ThreadProcInstance = new Thread(ThreadProcStart);
ThreadProcInstance.Name = "ThreadProcID:" + i;
ThreadProcInstance.IsBackground = true;
ThreadProcInstance.Start();
} /* iRecordCount=ResultlistView.Items.Count;
while(iLoopCount<iRecordCount)
{
while (iThreadCount < nMaxThread && iLoopCount != iRecordCount)
{
ThreadStart ThreadProcStart = delegate() { ThreadProc(iThreadCount, iThreadCount.ToString()); };
Thread ThreadProcInstance = new Thread(ThreadProcStart);
ThreadProcInstance.Name = "ThreadProcID:" + iThreadCount;
ThreadProcInstance.IsBackground = true;
ThreadProcInstance.Start();
iThreadCount++;
iLoopCount++;
}
Thread.Sleep(100);
}*/
} private void ThreadProc(int iID, String strText)
{
String strResult = "The" + iID + "Result";
bool UpdataState;
if(this.InvokeRequired)
{
SetListViewCall UpdataCall=new SetListViewCall(SetListView);
UpdataState=(bool)this.Invoke(UpdataCall,new Object[]{iID,strResult});
}else{
UpdataState=SetListView(iID,strResult);
}
///iThreadCount--;
///System.Threading.Thread.CurrentThread.Abort();
} private delegate bool SetListViewCall(int dIndex,String dName); private bool SetListView(int iIndex, String strText)
{
ResultlistView.Items[iIndex].SubItems.Add(strText);
ResultlistView.Refresh();
return true;
} private void Main_Load(object sender, EventArgs e)
{
ResultlistView.Columns.Add("ID");
ResultlistView.Columns.Add("String");
for (int i = 0; i < 100; i++)
{
ResultlistView.Items.Add(i.ToString());
}
}
}
}程序就一个listview和按钮为什么用for循环创建的多线程可以给ResultListView添加上数据,而While循环就是不行呢?求高手解,或者有比较好的变通方法?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货