C# 如何让 多线程中每个线程间隔毫秒执行同一个方法?

言多必失 2015-04-19 02:28:17
加精
多线程的好处 让效率提高很多倍,但是在某些情况下 要求操作同一个方法的时候要求有间隔,
这个间隔当然是毫秒级别的 否则多线程的意义就体现不出来,

本问题就是 怎么让多线程中每个线程间隔 毫秒执行同一个方法,

测试代码如下:
private void btnTest_Click(object sender, EventArgs e)
{
TestManyThread test = new TestManyThread();
test.Start();
}

主要代码如下

class TestManyThread
{
private static DateTime lastOperyTime = DateTime.Now;
private static object lockTime = new object();
public static DateTime LastOperyTime
{
get
{
lock (lockTime)
{
return TestManyThread.lastOperyTime;
}
}
set
{
lock (lockTime)
{
TestManyThread.lastOperyTime = value;
}
}
}
public void Start()
{

for (int i = 0; i < 10; i++)
{
Thread th = new Thread(new ThreadStart(DoSomeThing));
th.Name = i.ToString();
th.SetApartmentState(ApartmentState.MTA);
th.IsBackground = true;
th.Start();
}
}
/// <summary>
/// 多个线程 做同一件事件 但是要求每一个线程做同一件事件之间有毫秒级的间隔
/// </summary>
private void DoSomeThing()
{
TimeSpan sp = DateTime.Now.Subtract(LastOperyTime);
int intervalTime = 100;//2个线程之间的间隔时间 毫秒
if (sp.TotalMilliseconds < intervalTime)
{
System.Threading.Thread.Sleep(intervalTime);
}
LastOperyTime = DateTime.Now;
string info = string.Format("线程ID:{0},执行时间:{1}"
, Thread.CurrentThread.Name, DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss:ffff"));
Console.WriteLine(info);
}
}
...全文
11980 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
ANARYI 2016-12-23
  • 打赏
  • 举报
回复
在DoSomeThing()里Sleep()实在是逻辑上面有点问题,虽然论坛里面的大神说话有时候会很冲。但是他们也是很认真的在回答问题的。希望LZ能考虑他们的意见。
1830555726 2016-12-23
  • 打赏
  • 举报
回复
我来抢沙发啦。
风吹腚腚凉 2016-12-23
  • 打赏
  • 举报
回复
引用 28 楼 QQ81867376 的回复:
[quote=引用 6 楼 sp1234 的回复:] 你的 Thread.Sleep 完全放错了地方。一个“DoSomething”怎么管起线程的事情来了? 你这个程序就是“摆着毛病而故意胡乱找理由”。你既然一齐“Thread.Start”,然后来纠结它们“应该间隔100毫秒再启动”,这不是自相矛盾嘛。 故意找到一个无关的代码去纠结一个很浅显的需求,是为了什么呢?
对于你的教育 放心我不是百分百的吸收, 因为你不清楚别人的需求在这 就开始教育人. 线程启动的时候为什么要停止 , 你想过没有, 另外这样简单的 别人想不到? 还是说下的我需求, 10个线程开始工作, 每个线程都要 解析网页内容,仅仅是在提交的时候 间隔不能低于500毫秒, 解析很花时间,每个一个停止100毫秒 浪费时间 , 仅仅在提交的时候 需要间隔一下, 明白了????? 所以 不要说别人 偷换概念 ,什么逻辑 什么 ... 你的帖子的见过 比较多 , 为什么总是在这个方面教育人呢 , 写出代码 能说明问题,其次才是你这道理 [/quote] 他就那样算了吧,不用较真, 你每个线程处理完毕以后,把数据放在队列里面去, 再开一个task 单独轮训队列,时间间隔为500毫秒,时间充分利用,完美解决你的问题了。
风吹腚腚凉 2016-12-23
  • 打赏
  • 举报
回复
单说问题本身, 你可以加个逻辑如果时间
引用 50 楼 conmajia 的回复:
我不明白的是为什么操作同一个方法而且中间可以有数百毫秒这么长时间的间隔,还要分成多个线程来操作。。要不要吃点屎冷静一下再来写程序啊?
。。。。我的还热乎。。。。
风吹腚腚凉 2016-12-23
  • 打赏
  • 举报
回复
引用 楼主 QQ81867376 的回复:
多线程的好处 让效率提高很多倍,但是在某些情况下 要求操作同一个方法的时候要求有间隔, 这个间隔当然是毫秒级别的 否则多线程的意义就体现不出来, 本问题就是 怎么让多线程中每个线程间隔 毫秒执行同一个方法, 测试代码如下:
private void btnTest_Click(object sender, EventArgs e)
        {
            TestManyThread test = new TestManyThread();
            test.Start();
        }
主要代码如下

 class TestManyThread
    {
        private static DateTime lastOperyTime = DateTime.Now;
        private static object lockTime = new object();
        public static DateTime LastOperyTime
        {
            get
            {
                lock (lockTime)
                {
                    return TestManyThread.lastOperyTime;
                }
            }
            set
            {
                lock (lockTime)
                {
                    TestManyThread.lastOperyTime = value;
                }
            }
        }
        public void Start()
        {

            for (int i = 0; i < 10; i++)
            {
                Thread th = new Thread(new ThreadStart(DoSomeThing));
                th.Name = i.ToString();
                th.SetApartmentState(ApartmentState.MTA);
                th.IsBackground = true;
                th.Start();
            }
        }
        /// <summary>
        /// 多个线程 做同一件事件  但是要求每一个线程做同一件事件之间有毫秒级的间隔
        /// </summary>
        private void DoSomeThing()
        {
            TimeSpan sp = DateTime.Now.Subtract(LastOperyTime);
            int intervalTime = 100;//2个线程之间的间隔时间 毫秒
            if (sp.TotalMilliseconds < intervalTime)
            {
                System.Threading.Thread.Sleep(intervalTime);
            }
            LastOperyTime = DateTime.Now;
            string info = string.Format("线程ID:{0},执行时间:{1}"
              , Thread.CurrentThread.Name, DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss:ffff"));
            Console.WriteLine(info);
        }
    }
你的需求很奇怪
pdang 2016-05-16
  • 打赏
  • 举报
回复
10个线程 做10个地方的同一件事 特定的场合确实不能一起来做 需要间隔开时间 也正在学习类似楼主的问题
SomethingJack 2016-04-25
  • 打赏
  • 举报
回复
感觉楼主可以把你自己的需求说一下 或许有其他解决思路
btxp163 2016-04-25
  • 打赏
  • 举报
回复
引用 37 楼 Z65443344 的回复:
这就好比,有个厕所堵了,前一个人上完厕所之后,后一个人必须等2分钟才能再上,否则就冒水了 如果你多线程不做同步,那么相当于所有人互相都不认识,自己去判断别人是否上过了,那不现实,判断不了,互相没有沟通 你需要有个看门的老大爷,定时往里面放人,有人了就不许进,间隔少于2分钟也不许进
好例子
於黾 2015-08-12
  • 打赏
  • 举报
回复
解析很花时间,每个一个停止100毫秒 浪费时间 , 仅仅在提交的时候 需要间隔一下, 明白了????? 既然时间都花费在解析上,而不是抓取网页的通信上 那么就应该用一个线程定时去抓取网页,抓取到了就动态的开多线程(或用线程池)去解析 而不是连抓取带解析都放到同一个线程里
Conmajia 2015-08-11
  • 打赏
  • 举报
回复
我不明白的是为什么操作同一个方法而且中间可以有数百毫秒这么长时间的间隔,还要分成多个线程来操作。。要不要吃点屎冷静一下再来写程序啊?
willhuo 2015-08-10
  • 打赏
  • 举报
回复
除非你做个锁,要么没办法
笔落惊风 2015-07-29
  • 打赏
  • 举报
回复
问题在于DataTime.Now的精度,最小精度16.5ms看到你的数据,有几个线程时间显示一样了么!你可以单独打印Data.Now.毫秒 就可以看到效果了, 不要打印所有时间
john_QQ:2335298917 2015-06-25
  • 打赏
  • 举报
回复
向大神学习,留个记号
mmqw 2015-06-25
  • 打赏
  • 举报
回复
有点用多线程来做单线程的事的赶脚
银龙软件 2015-06-19
  • 打赏
  • 举报
回复
这个有问题,咋还置顶了。。。。。。
yangzi0764 2015-04-30
  • 打赏
  • 举报
回复
http://kb.cnblogs.com/page/42533/ 讲的很好
cppshooter 2015-04-30
  • 打赏
  • 举报
回复
没见过这样的用法。思路有问题~~ 线程可以同步
a1295962107 2015-04-30
  • 打赏
  • 举报
回复
学习了,很有用
月梦雨晨 2015-04-28
  • 打赏
  • 举报
回复
收藏学习一下,感谢各位大神!
於黾 2015-04-27
  • 打赏
  • 举报
回复
这就好比,有个厕所堵了,前一个人上完厕所之后,后一个人必须等2分钟才能再上,否则就冒水了 如果你多线程不做同步,那么相当于所有人互相都不认识,自己去判断别人是否上过了,那不现实,判断不了,互相没有沟通 你需要有个看门的老大爷,定时往里面放人,有人了就不许进,间隔少于2分钟也不许进
加载更多回复(33)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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