想做一个多线程定时触发器,是一个手上编写的外挂用的,作用就是定时执行某个任务,而且要多线程的。求高手给个思路,尤其是多线程那块 因为还需要在用户界面上体现数据。

解决方案 »

  1.   

    不需要思路,msdn中查找thread.timer,写得很明白。
      

  2.   

    对,确实和网络爬虫一样。我再补充一下问题:定时触发是一方面 这个容易解决,触发后我需要的是执行获取网页的任务,并需要取得返回的数据。在这个期间定时继续,但是不能触发事件(到点的任务在消息队列里面),因为我需要在上一个任务执行完以后再执行,我现在的做法是用简单的2个Forms.timer做得的,一个计时到点的任务丢到消息队列中去,一个读取消息队列里面的任务并执行,现在就是执行任务时太卡,我想获得更好的用户体验需要怎么实现?(多线程我了解不多 但是基本编程还是没问题)
      

  3.   

    改用thread.timer出现了一个问题 获取的数据不对 因为我是同时运行多个触发器, 一用线程 获取的数据就混乱了,我一直找不到原因。
      

  4.   

         这是我目前的代码 高手分析下 有什么问题。总觉得让人不放心。   
            /// <summary>
            /// 主线程
            /// </summary>
            private void Main()
            {
                //循环运行
                while (operatingStatus)
                {
                    //每秒执行,计时
                    Thread.Sleep(1000);
                    lock (programList)
                    {
                        //读取任务列表并计时。
                        foreach (UserProgram program in programList)
                        {
                            if (program != null)
                            {
                                //到点
                                if (!program.HasCompleted & program.TimeLater <= 0)
                                {
                                    //将任务放入执行队列
                                    lock (executeList)
                                    {
                                        executeList.Enqueue(program);
                                    }
                                    program.HasCompleted = true;
                                }
                                //计时
                                program.TimeLater--;
                            }
                        }
                    }
                }
            }        /// <summary>
            /// 执行任务线程。
            /// </summary>
            private void Execution()
            {
                //循环运行
                while (operatingStatus)
                {
                    //休眠0.1秒
                    Thread.Sleep(100);
                    //上个任务结束前休眠
                    while(!completed) Thread.Sleep(10);
                    //执行队列中的任务>0时
                    if (executeList.Count > 0)
                    {
                        //任务完成标志
                        completed = false;
                        //读取任务。
                        UserProgram program;
                        lock (executeList)
                        {
                           program  = executeList.Dequeue() as UserProgram;
                        }
                        //执行任务
                        if (program != null)
                        {
                            lock (owerUser)
                            {
                                switch (program.Program)
                                {
                                    case ProgramType.UserLogin:
                                        session.ExecutionUserLogon();
                                        if (Operation != null) Operation(operatingStatus, null);
                                        break;
                                    case ProgramType.HarvestAllKey:
                                        session.ExecutionHarvestAllKey();
                                        break;
                                    case ProgramType.MonarchInfo:
                                        session.GetMonarchInfo();
                                        break;
                                    case ProgramType.DailyMission:
                                        session.ExecutionDailyMission();
                                        break;
                                    case ProgramType.GainAllHonorGift:
                                        session.ExecutionGainAllHonorGift();
                                        break;
                                    case ProgramType.OneselfWater:
                                        session.ExecutionOneselfWater();
                                        break;
                                    case ProgramType.OneselfFeed:
                                        session.ExecutionOneselfFeed();
                                        break;
                                    case ProgramType.HarvestTree:
                                        session.ExecutionHarvestTree();
                                        break;
                                    case ProgramType.HitEggKey:
                                        session.ExecutionHitEggKey();
                                        break;
                                    case ProgramType.Luck:
                                        session.ExecutionLuck();
                                        break;
                                    case ProgramType.Building:
                                        session.ExecutionBuildingLevelUp();
                                        break;
                                    default:
                                        break;
                                }
                            }
                        }
                        else { completed = true; }
                    }
                }
            }        /// <summary>
            /// 任务完成事件。
            /// </summary>
            /// <param name="programList">任务列表</param>
            private void session_SessionCompleted(UserProgramCollection programList)
            {
                if (programList.Count > 0)
                {
                    lock (this.programList)
                    {
                        this.programList.AddRange(programList);
                        try
                        {
                            this.programList.Sort(delegate(UserProgram x, UserProgram y) { return x.TimeLater.CompareTo(y.TimeLater); });
                        }
                        catch { }
                    }
                }
                //任务完成标志
                completed = true;
            }