System.Threading.Timer 执行完当前任务再进行下一个任务

时间:2021-03-02 16:55:54
使用System.Threading.Timer 创建了一个每隔一秒执行一次的线程
要执行的任务是通过webservice来获取当前的数据

但是有时候webservice返回数据的时间会超过1秒,有时甚至是几十秒
这个时候如果1秒内没有执行完, System.Threading.Timer 就会再开一个新的线程

我在输出信息的时候发现,获取到的数据经常会连着好几条是同一个时间点的
并且有时候突然返回一条好几秒前的数据

我是想 能不能让System.Threading.Timer 等获取完这一次数据后 再进行下一次获取

6 个解决方案

#1


我做过类似的东西,也是用WebBrowser抓数据。
我的做法是,在打开WebBrowser之后就加一个bool锁,如果这个bool为true就表示WebBrowser已经在执行,Timer在当前时间节点就不生成新的WebBrowser,否则生成。
不知能否满足你的要求。

#2


引用 1 楼 fengduole 的回复:
我做过类似的东西,也是用WebBrowser抓数据。
我的做法是,在打开WebBrowser之后就加一个bool锁,如果这个bool为true就表示WebBrowser已经在执行,Timer在当前时间节点就不生成新的WebBrowser,否则生成。
不知能否满足你的要求。

System.Threading.Timer 执行完当前任务再进行下一个任务
这个也是我目前能想到的唯一的方法
我对线程不大了解,没敢乱用,所以来求助的

#3


加个标记不就好了吗

#4


我建议楼主处理后面的结果就行了.本来远程调用你如果非要等返回了结果再来执行下一次,那么这个你可以不用timer来处理,就直接同步主法就可以搞定.
建议远程这种还是异步好.

#5


定时器重入问题
try
{
        timer.Stop();
        invokeWebService();
}
finnally
{
         timer.Start();
}

#6


                   System.Timers.Timer tm = new System.Timers.Timer(intelval);
                    tm.Elapsed += (sender, e) =>{
                    System.Timers.Timer t = sender as System.Timers.Timer;
                    t.Enable = false;
                    ///TODO:你需要的业务
                    t,Enable = true;
                   });

#1


我做过类似的东西,也是用WebBrowser抓数据。
我的做法是,在打开WebBrowser之后就加一个bool锁,如果这个bool为true就表示WebBrowser已经在执行,Timer在当前时间节点就不生成新的WebBrowser,否则生成。
不知能否满足你的要求。

#2


引用 1 楼 fengduole 的回复:
我做过类似的东西,也是用WebBrowser抓数据。
我的做法是,在打开WebBrowser之后就加一个bool锁,如果这个bool为true就表示WebBrowser已经在执行,Timer在当前时间节点就不生成新的WebBrowser,否则生成。
不知能否满足你的要求。

System.Threading.Timer 执行完当前任务再进行下一个任务
这个也是我目前能想到的唯一的方法
我对线程不大了解,没敢乱用,所以来求助的

#3


加个标记不就好了吗

#4


我建议楼主处理后面的结果就行了.本来远程调用你如果非要等返回了结果再来执行下一次,那么这个你可以不用timer来处理,就直接同步主法就可以搞定.
建议远程这种还是异步好.

#5


定时器重入问题
try
{
        timer.Stop();
        invokeWebService();
}
finnally
{
         timer.Start();
}

#6


                   System.Timers.Timer tm = new System.Timers.Timer(intelval);
                    tm.Elapsed += (sender, e) =>{
                    System.Timers.Timer t = sender as System.Timers.Timer;
                    t.Enable = false;
                    ///TODO:你需要的业务
                    t,Enable = true;
                   });