日期:2014-05-17  浏览次数:20959 次

求教:.net 3.5多线程代码如何改成4.0 task任务来处理?
本帖最后由 tylrr 于 2013-12-20 02:45:43 编辑
请教大伙,我想用多线程来抓取一组链接的数据,我的思路是每个线程取到一个链接后,抓取完该链接的数据后,把该链接元素从待处理链接数组中删除。 我原来的代码是3.5下面运行的,现在想改成用4.0新增的task 特性来达到同样的效果,请问应该如何修改? 

还有一个问题是,使用了task后,如果某个线程发生了异常(比如数据抓取不全),如何重启该线程并重新活链接进行处理?  谢谢



 //声明全局变量:所有待处理的网址数组
public static List<string> links = new List<string>();

         //按钮事件
        private void button1_Click(object sender, EventArgs e)
        {
                    threadOne = new Thread(new ThreadStart(getItemDetail));//两个线程共同做一件事情
                    threadTwo = new Thread(new ThreadStart(getItemDetail));//两个线程共同做一件事情
                    threadOne.Name = "线程1";
                    threadTwo.Name = "线程2";
                    threadOne.Start();
                    threadTwo.Start();

        }


        private void getItemDetail()  //处理函数
        {
            string link = null;  //单条网址
            while (true)
            {
                Monitor.Enter(links);//锁定,保持同步
                link = (string)links[0];

。。。somecode here//  具体的处理语句,每次处理需要耗时一分钟

                    links.RemoveAt(0);//删除链接数组List中的元素
                   
                    if (links.Count == 0)
                    {
                        ThreadEnd();//引发完成事件
                    }
                    toolStripStatusLabel1.Text = Thread.CurrentThread.Name + "抓取" + link + "成功...";

                    Monitor.Exit(links