定时器 重复建立相同线程

tracy1421 2020-11-12 05:08:35
C# 写了个windows服务,服务定时调用某方法,方法里会新建2个线程来调用其他方法,现在会有某个线程没结束,然后服务到了定时再启动的时间,又新建了同样方法的线程,如何能判断该线程状态,想在定时再启动的时候销毁此线程
...全文
11877 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tracy1421 2020-11-17
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
[quote=引用 楼主 tracy1421 的回复:]C# 写了个windows服务,服务定时调用某方法,方法里会新建2个线程来调用其他方法,现在会有某个线程没结束,然后服务到了定时再启动的时间,又新建了同样方法的线程,如何能判断该线程状态,想在定时再启动的时候销毁此线程
定时器的特定确实是这样,不管这一轮有没有完成,到时间间隔就会启动新的线程 如果前一轮都没有执行完,其实得问两个问题 1. 未完成的会不会影响后一轮的执行? 2. 定时器间隔是不是过小?该优化程序或者调大timer的间隔 [/quote] 老哥,其实我就想模拟一下在这种情况下如何处理的,比如上一次没结束,我服务定时到了,就不起新的线程了~
tracy1421 2020-11-17
  • 打赏
  • 举报
回复
引用 13 楼 OrdinaryCoder 的回复:
[quote=引用 12 楼 tracy1421 的回复:][quote=引用 10 楼 OrdinaryCoder 的回复:][quote=引用 8 楼 tracy1421 的回复:][quote=引用 3 楼 OrdinaryCoder 的回复:]添加一个全局标志变量,在线程开始置true 结束之false 启动线程前先判断该标志是true还是false 再决定是否要启动线程
老哥,我每次定时调方法时都要new一下,我想问下这个全局变量加在哪儿比较好[/quote] 没有代码我也说不好在哪 而且你这个new一下 我也不知道new的是什么[/quote]嗯,我改成静态类了~之前我的意思是定时服务调用了另一个类的方法,每次调用前要new一下,对应的类的全局变量应该也会变,所有我改成静态类,直接调用方法,然后再静态类声明全局变量用来做标志,这样应该可行吧~老哥~[/quote] 理论上可行 但是你直接改成静态类 感觉不太好 [/quote]老哥,还有更好的方法吗?非静态的话如何保持全局变量不变~
xian_wwq 2020-11-17
  • 打赏
  • 举报
回复
老哥,其实我就想模拟一下在这种情况下如何处理的,比如上一次没结束,我服务定时到了,就不起新的线程了~[/quote] 不使用timer,自己来控制线程, 确保每一轮的执行都是完整的
tracy1421 2020-11-16
  • 打赏
  • 举报
回复
引用 7 楼 datafansbj 的回复:
线程不要盲目销毁,一个线程如果暴力终止,可能会导致不可预料的后果。
嗯,所有想有个办法,通过线程状态判断~
tracy1421 2020-11-16
  • 打赏
  • 举报
回复
引用 3 楼 OrdinaryCoder 的回复:
添加一个全局标志变量,在线程开始置true 结束之false 启动线程前先判断该标志是true还是false 再决定是否要启动线程
老哥,我每次定时调方法时都要new一下,我想问下这个全局变量加在哪儿比较好
datafansbj 2020-11-16
  • 打赏
  • 举报
回复
线程不要盲目销毁,一个线程如果暴力终止,可能会导致不可预料的后果。
OrdinaryCoder 2020-11-16
  • 打赏
  • 举报
回复
引用 12 楼 tracy1421 的回复:
[quote=引用 10 楼 OrdinaryCoder 的回复:][quote=引用 8 楼 tracy1421 的回复:][quote=引用 3 楼 OrdinaryCoder 的回复:]添加一个全局标志变量,在线程开始置true 结束之false 启动线程前先判断该标志是true还是false 再决定是否要启动线程
老哥,我每次定时调方法时都要new一下,我想问下这个全局变量加在哪儿比较好[/quote] 没有代码我也说不好在哪 而且你这个new一下 我也不知道new的是什么[/quote]嗯,我改成静态类了~之前我的意思是定时服务调用了另一个类的方法,每次调用前要new一下,对应的类的全局变量应该也会变,所有我改成静态类,直接调用方法,然后再静态类声明全局变量用来做标志,这样应该可行吧~老哥~[/quote] 理论上可行 但是你直接改成静态类 感觉不太好
tracy1421 2020-11-16
  • 打赏
  • 举报
回复
引用 10 楼 OrdinaryCoder 的回复:
[quote=引用 8 楼 tracy1421 的回复:][quote=引用 3 楼 OrdinaryCoder 的回复:]添加一个全局标志变量,在线程开始置true 结束之false 启动线程前先判断该标志是true还是false 再决定是否要启动线程
老哥,我每次定时调方法时都要new一下,我想问下这个全局变量加在哪儿比较好[/quote] 没有代码我也说不好在哪 而且你这个new一下 我也不知道new的是什么[/quote]嗯,我改成静态类了~之前我的意思是定时服务调用了另一个类的方法,每次调用前要new一下,对应的类的全局变量应该也会变,所有我改成静态类,直接调用方法,然后再静态类声明全局变量用来做标志,这样应该可行吧~老哥~
shawn_yang 2020-11-16
  • 打赏
  • 举报
回复
timer本身就是线程吧,你可以判断timer的状态再决定后续运行内容
OrdinaryCoder 2020-11-16
  • 打赏
  • 举报
回复
引用 8 楼 tracy1421 的回复:
[quote=引用 3 楼 OrdinaryCoder 的回复:]添加一个全局标志变量,在线程开始置true 结束之false 启动线程前先判断该标志是true还是false 再决定是否要启动线程
老哥,我每次定时调方法时都要new一下,我想问下这个全局变量加在哪儿比较好[/quote] 没有代码我也说不好在哪 而且你这个new一下 我也不知道new的是什么
  • 打赏
  • 举报
回复
你的这个设计问题,在于满脑子只有“线程”简单概念,而没有线程的状态控制概念。
  • 打赏
  • 举报
回复
给你写个 demo:
using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
test();
Console.WriteLine("..................按任意键结束程序");
Console.ReadKey();
}

static async void test()
{
for (var i = 0; i < 5; i++)
{
Console.WriteLine($"i={i}.....开始");
var task1 = Task.Run(() => action_1());
var task2 = Task.Run(() => action_2());
await Task.WhenAll(task1, task2);
Console.WriteLine($"i={i}.....已经等到各任务结束!{(i != 4 ? "100毫秒后继续处理\r\n":"")}");
await Task.Delay(100);
}
}

static void action_1()
{
Console.WriteLine("开始执行 1");
Thread.Sleep(new Random().Next(1, 3000));
Console.WriteLine("过程 1 执行完毕");
}

static void action_2()
{
Console.WriteLine("开始执行 2");
Thread.Sleep(new Random().Next(1, 3000));
Console.WriteLine("过程 2 执行完毕");
}

}
}


要注意,父线程(调用线程)不要用什么阻塞语句(例如 Task.WaitAll)去占用宝贵的线程资源,而是应该用非阻塞的 Task.WhenAll 语句。
心受伤易碎 2020-11-13
  • 打赏
  • 举报
回复
不用定时器,改用while(true)+Thread.Sleep(3000)实现定时效果,
OrdinaryCoder 2020-11-13
  • 打赏
  • 举报
回复
添加一个全局标志变量,在线程开始置true 结束之false 启动线程前先判断该标志是true还是false 再决定是否要启动线程
xian_wwq 2020-11-12
  • 打赏
  • 举报
回复
引用 楼主 tracy1421 的回复:
C# 写了个windows服务,服务定时调用某方法,方法里会新建2个线程来调用其他方法,现在会有某个线程没结束,然后服务到了定时再启动的时间,又新建了同样方法的线程,如何能判断该线程状态,想在定时再启动的时候销毁此线程
定时器的特定确实是这样,不管这一轮有没有完成,到时间间隔就会启动新的线程 如果前一轮都没有执行完,其实得问两个问题 1. 未完成的会不会影响后一轮的执行? 2. 定时器间隔是不是过小?该优化程序或者调大timer的间隔
wanghui0380 2020-11-12
  • 打赏
  • 举报
回复
极端情况,每次都没有结果,你都停掉前面的,那么你可能永远拿不到结果。 请等着前面的结束,当然给前面的设定为超时结束(最大执行时间,你定时器的2,3个周期) 或者 限流队列,你不要急着产生线程。先把任务加到限流队列。在由调度器自己消费调他 (此处需要限流,极端情况,生产的赶不上消费的,队列就会无限加,结果是崩溃。同时限流的另一个目的是,你可以检查堆积数量,假设你另外的事件发现任务长期处于满负荷状态,并且还有新任务加入,你需要报警写日志。此时你就知道,要么是你那两个2线程根本就来不及处理,需要优化。要么就是你这个定时器根本不符合实际的生产能力,需要调整时间)

110,567

社区成员

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

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

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