线程类

来源:互联网 发布:长江交易软件下载 编辑:程序博客网 时间:2024/06/10 17:43
    public class UIAsyncJober    {        public delegate void JoberRunMethodDelegate(UIAsyncJober job);        private static Dictionary<string, UIAsyncJober> jobs = new Dictionary<string, UIAsyncJober>();        private ThreadStart beforeMethod = null;        private ThreadStart runMethod = null;        private ThreadStart doneMethod = null;        private ThreadStart inProcessMethod = null;        private SynchronizationContext context;        private UIAsyncJober()        {            context = SynchronizationContext.Current;        }        public static UIAsyncJober GetJob()        {            return GetJob(Guid.NewGuid().ToString());        }        public static UIAsyncJober GetJob(string id)        {            if (jobs.ContainsKey(id))            {                return jobs[id];            }            var newjob = new UIAsyncJober();            jobs.Add(id, newjob);            return newjob;        }        public UIAsyncJober BeforeStart(ThreadStart method)        {            this.beforeMethod = method;            return this;        }        public UIAsyncJober Run(ThreadStart method)        {            this.runMethod = method;            return this;        }        public UIAsyncJober Done(ThreadStart method) // 还用ThreadStart委托,只是不想再定义一个委托了        {            this.doneMethod = method;            return this;        }        public UIAsyncJober InProcess(ThreadStart method)        {            this.inProcessMethod = method;            return this;        }        public void ReportProcess()        {            context.Send(new SendOrPostCallback(                s =>                {                    inProcessMethod();                }            ), null);        }        Thread current = null;        public void Start()        {            // stop already running thread            if (current != null)            {                try                {                    current.Abort();                }                catch (Exception)                {                    // do nothing                }            }            if (beforeMethod != null)            {                beforeMethod();            }            current = new Thread(new ThreadStart(innerRun));            current.Start();        }        public void Abort()        {            if (current != null)            {                try                {                    current.Abort();                }                catch (Exception ex)                {                }            }        }        private void innerRun()        {            runMethod();            context.Send(new SendOrPostCallback(                s =>                {                    if (doneMethod != null)                    {                        doneMethod();                    }                }            ), null);        }    }

            UIAsyncJober jober = UIAsyncJober.GetJob("");            jober.Run(delegate()            {                          }).Done(delegate()            {                            }).InProcess(() =>            {                //显示进度            }).Start();

0 0