关于多线程的问题!求帮助!!!!

tololo 2014-11-07 11:11:05
要求是要开三个线程,三个线程分别做不同的任务,其中两个线程每小时检查一次数据库,另一个线程是每天固定时间检查一次,对线程不熟,谁了解的帮我一下,谢谢
...全文
296 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tololo 2014-11-10
  • 打赏
  • 举报
回复
虽然没有解决问题,但是谢谢你们俩
  • 打赏
  • 举报
回复
mh = new ManualResetEvent(false); // mh 定义为 public ManualResetEvent mh; mh.WaitOne();
  • 打赏
  • 举报
回复
引用 17 楼 u013331731 的回复:
class Program
    {
        private readonly static AliUserBusiness aliUserBusiness = new AliUserBusiness();
        private readonly static AliProductBusiness aliProductBusiness = new AliProductBusiness();
        private readonly static AliAppKeyBusiness aliAppKeyBusiness = new AliAppKeyBusiness();
        private static AliUser aliUser = new AliUser();
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(ThreadD));
            thread.Start();

            Thread thread2 = new Thread(new ThreadStart(refreshtoken));
            thread2.Start();
        }
        private static void ThreadD()
        {
            //获取所有用户信息
            IList<AliUser> list = aliUserBusiness.GetAliUserList("");
            if (list.Count > 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    TimeSpan ts = DateTime.Now - list[i].ReLastTokenDate.Value;
                    if (ts.TotalHours >= 9)
                    {
                        Token token = ApiToken.RefreshToken(list[i].refresh_token);
                        //刷新access_token令牌
                        aliUserBusiness.UpdateAccess_token(list[i].memberId, token.access_token);
                        Console.WriteLine("更新成功!");
                    }
                    else
                    {
                        Console.WriteLine("令牌未过期!");
                    }
.................................
    }
我把我代码贴出了大家帮我看看哪些地方要改,或者不合理,两个必须开启两个线程,我用不懂线程,不知道能不能这样想,大家指点下,谢谢
代码太多,没有多少时间看。随便说几点。 如果你是一个Console程序,那么在Main中必须阻塞,不能让住进程结束。例如写
mh = new MaualResetEvent(false);   // mh 定义为 public ManualResetEvent mh;
mh.WaitOne();
(使用系统线程池)启动一个线程,只需要写
ThreadPool.QueueUserWorkItem(h => method());
就可以了,不需要写更多的代码。(其中的 => 只后的内容随便写可执行代码。 绝不要胡乱递归!要改为循环结构。 尽量不要写 Sleep(...) 阻塞代码。如果需要定时,应该使用系统定时器。系统定时器不需要什么线程阻塞,它是系统的硬件中断事件驱动的。
  • 打赏
  • 举报
回复
"必须使用线程" 呵呵 还真以为线程是什么好东西啊,多少隐形bug就是它带出来的. 看你的需求,完全不需要去维护什么"三个线程" 从task的角度去理解并发吧.
江南小鱼 2014-11-07
  • 打赏
  • 举报
回复
开启三个线程,每隔两个小时执行一次,就是执行完一次,线程Sleep两个小时 每天固定时间检查,可以判断系统时间是否等于xx时,等于才执行 另外,也可以指定Windows计划定制执行
引用 楼主 u013331731 的回复:
要求是要开三个线程,三个线程分别做不同的任务,其中两个线程每小时检查一次数据库,另一个线程是每天固定时间检查一次,对线程不熟,谁了解的帮我一下,谢谢
  • 打赏
  • 举报
回复
作为一个“出题”,考虑使用线程也可以理解。主要原因就是为了达到一定意义上的“并行性”。当三个任务恰好同时执行时,不会有先后影响。 比如说你有100个
public void test()
{
    .....
}
这类小程序,他们千奇百怪,顺序执行一遍要120秒。现在你使用50个线程并发执行它们,或许每一个方法都不会比之前的执行时间更短,但是总体的完成时间可能就只需要25秒就行了。 我想 lz 得到了这样一个题目,可能目的还是考察他“创建三个线程”的能力。只不过出这个题目的人以为线程就是用来“阻塞、循环、等待”的,这方面是有问题的。
tololo 2014-11-07
  • 打赏
  • 举报
回复
我也在纠结为什么非要线程
by_封爱 2014-11-07
  • 打赏
  • 举报
回复
如果非得用线程 就这样吧..

  Thread t1 = new Thread(new ThreadStart(a));   
   t1.Start();
   void a()
   {
      while(true)
       { 
           if(datatime.now.minutes==1)
           { 
                //你的代码 当然上面的1 你从0到59你爱写成几就写几...反正一个小时只有一个0-59  
               //至于一天执行一次 你就判断datetime.now.hours==5...
           }
       }
   }
  • 打赏
  • 举报
回复
另外这个问题不要跟asp.net联系起来。asp.net不用来做这些。学习写这种程序,需要学习开发桌面应用程序。
於黾 2014-11-07
  • 打赏
  • 举报
回复
system.timers.timer 就是线程 它跟 system.forms.form.timer不是一个东西
tololo 2014-11-07
  • 打赏
  • 举报
回复
引用 7 楼 diaodiaop 的回复:
引用
要求是要开三个线程,三个线程分别做不同的任务, 其中两个线程每小时检查一次数据库, 另一个线程是每天固定时间检查一次
首先,这个东西system.timers.timer是最先想到的吧..设置下间隔就好了..而不是用什么"线程" 其次,正如1#说的quarzt.net调度非常好的东西...虽然不会但是你可以根据关键字搜索.. 另外.你这是什么程序?cs还是bs...
BS,CS忘得差不多了,要求用线程,我开始也是用timer做的,后来说要用线程
by_封爱 2014-11-07
  • 打赏
  • 举报
回复
而且 就你是需求而言数据库中的字段是否更改..完全可以用别的技术啊 最简单的 触发器 if(update(字段)) 这是最简单的吧 或者Service Broker +SqlDependency 多么完美的组合.. 好东西很多很多很多很多.你却选择了一个最低端,最浪费资源.最不稳定的"线程"....
tololo 2014-11-07
  • 打赏
  • 举报
回复
引用 5 楼 QQ234788028 的回复:

            Thread t1 = new Thread(new ThreadStart(a));
            t1.Start();
            Thread t2 = new Thread(new ThreadStart(b));
            t2.Start();
            Thread t3 = new Thread(new ThreadStart(c));
            t3.Start();

        /// <summary>
        /// 每日定时
        /// </summary>
        private static void a()
        {
            var date = DateTime.Now.ToString("yyyy-MM-dd 12:00:00");//每天12点做任务
            //执行任务
            if (DateTime.Parse(date) < DateTime.Now)//今日已过执行点
            {
                date = DateTime.Parse(date).AddDays(1).ToString();//去明日执行任务点时间
            }
            var ts1 =new TimeSpan(DateTime.Parse(date).Ticks);
            var ts2 =new TimeSpan(DateTime.Now.Ticks);
            var ts = ts1.Subtract(ts2).Duration();
            Thread.Sleep((int)ts.TotalMilliseconds);//睡眠
        }
        /// <summary>
        /// 每小时1
        /// </summary>
        private void b()
        {
            //执行任务
            Thread.Sleep(3600 * 1000);//睡眠
        }
        /// <summary>
        /// 每小时2
        /// </summary>
        private void c()
        {
            //执行任务
            Thread.Sleep(3600 * 1000);//睡眠
        }
跟我的想法有点类似,我也刚这样测试看行不行得通
by_封爱 2014-11-07
  • 打赏
  • 举报
回复
引用
要求是要开三个线程,三个线程分别做不同的任务, 其中两个线程每小时检查一次数据库, 另一个线程是每天固定时间检查一次
首先,这个东西system.timers.timer是最先想到的吧..设置下间隔就好了..而不是用什么"线程" 其次,正如1#说的quarzt.net调度非常好的东西...虽然不会但是你可以根据关键字搜索.. 另外.你这是什么程序?cs还是bs...
tololo 2014-11-07
  • 打赏
  • 举报
回复
要求非要用线程,我是做的一个控制台应用程序,这个程序要一直运行在服务器中,数据库中有两个字段要每个小时检查一次过期了没有,过期了就要更新,这就是要两线程控制,另一个线程就是每天固定时间重发一次数据库中数据,其实这个就是弄的阿里巴巴API重发用户产品数据
QQ234788028 2014-11-07
  • 打赏
  • 举报
回复

            Thread t1 = new Thread(new ThreadStart(a));
            t1.Start();
            Thread t2 = new Thread(new ThreadStart(b));
            t2.Start();
            Thread t3 = new Thread(new ThreadStart(c));
            t3.Start();

        /// <summary>
        /// 每日定时
        /// </summary>
        private static void a()
        {
            var date = DateTime.Now.ToString("yyyy-MM-dd 12:00:00");//每天12点做任务
            //执行任务
            if (DateTime.Parse(date) < DateTime.Now)//今日已过执行点
            {
                date = DateTime.Parse(date).AddDays(1).ToString();//去明日执行任务点时间
            }
            var ts1 =new TimeSpan(DateTime.Parse(date).Ticks);
            var ts2 =new TimeSpan(DateTime.Now.Ticks);
            var ts = ts1.Subtract(ts2).Duration();
            Thread.Sleep((int)ts.TotalMilliseconds);//睡眠
        }
        /// <summary>
        /// 每小时1
        /// </summary>
        private void b()
        {
            //执行任务
            Thread.Sleep(3600 * 1000);//睡眠
        }
        /// <summary>
        /// 每小时2
        /// </summary>
        private void c()
        {
            //执行任务
            Thread.Sleep(3600 * 1000);//睡眠
        }
  • 打赏
  • 举报
回复
线程逻辑中的“无限循环、阻塞等待”等等,如非有什么“实在是不得已”的苦衷,那就是在滥用线程。
xdashewan 2014-11-07
  • 打赏
  • 举报
回复
用定时器 http://msdn.microsoft.com/zh-cn/library/system.threading.timer(v=vs.110).aspx
  • 打赏
  • 举报
回复
谁给你的要求?这个描述逻辑、出发点很成问题。 比如说“其中两个线程每小时检查一次数据库”,那么检查数据库之前和之后干什么? 如果没事干,就不应该启动线程。你应该使用定时器注册“每2个小时触发一次事件”,然后当定时事件触发时,用两个线程分别检查数据库。检查完数据库,线程就结束了。下一个2小时触发事件到来时,又再次启动两个线程。
feiyun0112 2014-11-07
  • 打赏
  • 举报
回复
使用Quartz.net做计划任务
https://github.com/quartznet/quartznet
加载更多回复(3)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧