当前位置:开发者网络 >> 技术教程 >> .NET教程 >> 算法/线程 >> 内容
精彩推荐
分类最新教程
分类热点教程
  
线程池跟自定义事件的应用例子
作者:未知
日期:2003-07-12
人气:
投稿:Andy.m(转贴)
来源:未知
字体:
收藏:加入浏览器收藏
以下正文:
using System;
using System.Threading;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

namespace ThreadPoolDelegate
{
    //public delegate void ReceiveCompletedEventHandler(string url,string title,string sourcecode);
    public delegate void ReceiveCompletedEventHandler(object sender,ReceiveCompletedEventArgs e);
    
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    public class Class1
    {        
        public event ReceiveCompletedEventHandler ReceiveCompletedEvent;

        public Class1()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        public void ReadSourceCode(object o)
        {

            string url = (string)o;
            string title = "";
            string sourcecode = "";

            WebClient wc = new WebClient();

            byte[] data = wc.DownloadData(url);

            sourcecode = Encoding.Default.GetString(data);

            title = this.GetPageTitle(sourcecode);

            if (ReceiveCompletedEvent != null)
            {
                //ReceiveCompletedEvent(url,title,sourcecode);
                ReceiveCompletedEvent(this,new ReceiveCompletedEventArgs(url,title,sourcecode));
            }
        }

        public void ReadSourceCode(object o,bool timeout)
        {

            string url = (string)o;
            string title = "";
            string sourcecode = "";

            WebClient wc = new WebClient();

            byte[] data = wc.DownloadData(url);

            sourcecode = Encoding.Default.GetString(data);

            title = this.GetPageTitle(sourcecode);

            if (ReceiveCompletedEvent != null)
            {
                //ReceiveCompletedEvent(url,title,sourcecode);
                ReceiveCompletedEvent(this,new ReceiveCompletedEventArgs(url,title,sourcecode));
            }
        }

        private string GetPageTitle(string str)
        {
            string lTitle = "";
            string lPattern = "(?:<\\s*title\\s*>(?<t>[^<]+))";
            Regex rx = new Regex(lPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled );
            Match mt = rx.Match(str);
            if ( mt.Success )
                try
                {
                    lTitle = mt.Groups["t"].Value.ToString();
                }
                catch
                {
                    lTitle ="";
                }
            else
                lTitle = "";
            return lTitle;
        }

        
    }

    public class test
    {
        static ManualResetEvent ev = new ManualResetEvent(false);

        private static int intCount;

        private static DateTime dtStart = DateTime.Now;

        public static void Main(string[] args)
        {
        
            Class1 c = new Class1();
            c.ReceiveCompletedEvent += new ReceiveCompletedEventHandler(WriteOut);

            
            if (args.Length >=1)
            {
                for (int i=0;i<args.Length;i++)
                {
                    //ThreadPool.QueueUserWorkItem(new WaitCallback(c.ReadSourceCode),args[i]);
                    
                    ThreadPool.RegisterWaitForSingleObject(ev,new WaitOrTimerCallback(c.ReadSourceCode),args[i],3000,true);

                    intCount++;
                }

                ev.WaitOne();
            }
            else
            {
                Console.WriteLine("you must pass an argument at least ");
            }
            
        }

        
        private static void WriteOut(object sender,ReceiveCompletedEventArgs e)
        {
            try
            {
                intCount--;

                Console.WriteLine("正在执行......{0}",e.URL);

                FileStream fs = new FileStream(@"c:\"+e.Title+".txt",FileMode.Create,FileAccess.Write);
            
                StreamWriter sw = new StreamWriter(fs);

                sw.WriteLine(e.URL);
                sw.WriteLine();
                sw.WriteLine(e.Title);
                sw.WriteLine();
                sw.WriteLine(e.SourceCode);
                sw.WriteLine();

                sw.Flush();
            
                fs.Flush();

                sw.Close();

                fs.Close();

                Console.WriteLine("执行完成......{0}",e.URL);

                if(intCount == 0)
                {
                    Console.WriteLine("程序执行完成.....");

                    TimeSpan tsSpent = DateTime.Now.Subtract(dtStart);

                    Console.WriteLine("程序执行时间......{0}毫秒",tsSpent.TotalMilliseconds);

                    Console.WriteLine("程序在退出之前等待5秒,only for demo");

                    Thread.Sleep(5000);

                    ev.Set();
                }
            }
            catch(Exception ex)
            {
                throw new Exception(ex.Message);
            }

        }
        

        /*
        private static void WriteOut(string url,string title,string sourcecode)
        {
            intCount--;
        
            FileStream fs = new FileStream(@"c:\"+title+".txt",FileMode.Create,FileAccess.Write);

            StreamWriter sw = new StreamWriter(fs);

            sw.WriteLine(url);
            sw.WriteLine();
            sw.WriteLine(title);
            sw.WriteLine();
            sw.WriteLine(sourcecode);
            sw.WriteLine();

            sw.Flush();
            fs.Flush();

            sw.Close();

            fs.Close();
            
            Console.WriteLine("执行完成......{0}",e.URL);

            if(intCount == 0)
            {
                Console.WriteLine("程序执行完成.....");

                TimeSpan tsSpent = DateTime.Now.Subtract(dtStart);

                Console.WriteLine("程序执行时间......{0}毫秒",tsSpent.TotalMilliseconds);

                Console.WriteLine("程序在退出之前等待10秒,only for demo");

                Thread.Sleep(10000);

                ev.Set();
            }

        }
        */
        
    
    }

    public class ReceiveCompletedEventArgs : System.EventArgs
    {
        string _url;
        string _title;
        string _sourcecode;

        public string URL
        {
            get
            {
                return _url;
            }

        }

        public string Title
        {
            get
            {
                return _title;
            }
        }

        public string SourceCode
        {
            get
            {
                return _sourcecode;
            }
        }

        public ReceiveCompletedEventArgs(string url,string title,string sourcecode)
        {
            this._url = url;
            this._title = title;
            this._sourcecode = sourcecode;
        }
    }
}

这里定义了两种委托的方式,大家随便看看
相关文章: