假如我有一个字符串数组 string[] arr=str.Split(' ');
arr的长度会根据str的变化而变化。
我有一个方法deal(string a){访问数据库,在数据库中对a进行处理,这是一个很大的查询量,会比较耗时}
我想根据字符串数组arr的长度n=arr.Length,来动态的开辟n个线程来调用方法deal(arr[i])对arr中的每个值进行数据库处理。
然后,我需要等待所有的线程执行完毕后,进行一次最终的收尾处理Final(),必须要等待之前的所有线程都执行完毕才执行Final()。开辟线程我倒是懂得怎么弄,但是要等所有的线程都执行完毕这个我不是很懂,请各位高手帮忙指点迷津!谢谢!!!
arr的长度会根据str的变化而变化。
我有一个方法deal(string a){访问数据库,在数据库中对a进行处理,这是一个很大的查询量,会比较耗时}
我想根据字符串数组arr的长度n=arr.Length,来动态的开辟n个线程来调用方法deal(arr[i])对arr中的每个值进行数据库处理。
然后,我需要等待所有的线程执行完毕后,进行一次最终的收尾处理Final(),必须要等待之前的所有线程都执行完毕才执行Final()。开辟线程我倒是懂得怎么弄,但是要等所有的线程都执行完毕这个我不是很懂,请各位高手帮忙指点迷津!谢谢!!!
这样肯定不行,主线程怎么等待子线程呢?while去轮询这个计数器??呵呵,主线程就把cpu占尽了你就用AutoResetEvent来控制线程就可以了,这样就可以阻塞住主线程,而不是去轮询了。算了我写个示例代码吧。class Program
{
Thread[] _thds;
AutoResetEvent[] _resetEvents;
object[] _result;
static Main()
{
string[] arr = new string[20];_thds = new Thread[arr.Length];
_resetEvents = new AutoResetEvent[arr.Length];
_result = new object[arr.Length];
for(int i = 0; i< arr.Length; i ++)
{
_thds[i] = new Thread(Process);
_thds[i].Name = i.ToString();
_resetEvents[i] = new AutoResetEvent(false);
_thds[i].Start(arr[i]);
}
AutoResetEvent.WaitAll(_resetEvents);//开始处理最后的结果,从_result里拿出来。
}static void Process(object data)
{
char a = (char)data;
int index = (int)Thread.CurrentThread.Name;
//处理事务代码_result[i] = 处理后的结果;
_resetEvents[i].Set();
}
}代码刚刚手写的,可能有点问题,但你应该稍微改下就可以了。
在主线程中使用AutoResetEvent.WaitAll(_resetEvents); 会让界面卡住。
最好使用两个线程。
把Main中的代码放到一个线程中,然后由这个线程再执行其他线程并等待,也可以简单的使用join
---------------
先一下。