private static TimeSpan sleepTime = new TimeSpan(0, 0, 6);//定义了一个休眠时间
现在有线程A,重复执行方法AMethod()然后-->sleep(sleepTime);
AMethod()
{
/***********省略***********/
sleepTime = new TimeSpan(x, y, z);//重新定义了休眠时间
}现在我想做的是有个方法去通知A线程,如果A在休眠,让A唤醒立即去执行Amethod()方法。
唤醒A我使用的是A.Interrupt();但是这个方法之后,再去执行sleep()方法会报错,好像是执行过Interrupt();之后就不再允许sleep了。
还有一个疑问是如果线程A正在执行AMethod(),我希望在执行完AMethod()之后再去让线程从头开始跑。但是上面我的思路不对,可能会引发冲突。
写的比较乱,不知道你们看懂了没有 求高手帮看下//
现在有线程A,重复执行方法AMethod()然后-->sleep(sleepTime);
AMethod()
{
/***********省略***********/
sleepTime = new TimeSpan(x, y, z);//重新定义了休眠时间
}现在我想做的是有个方法去通知A线程,如果A在休眠,让A唤醒立即去执行Amethod()方法。
唤醒A我使用的是A.Interrupt();但是这个方法之后,再去执行sleep()方法会报错,好像是执行过Interrupt();之后就不再允许sleep了。
还有一个疑问是如果线程A正在执行AMethod(),我希望在执行完AMethod()之后再去让线程从头开始跑。但是上面我的思路不对,可能会引发冲突。
写的比较乱,不知道你们看懂了没有 求高手帮看下//
还有就是如果线程正在执行AMethod()的时候调用Interrupt()会不会出问题
还有就是如果线程正在执行AMethod()的时候调用Interrupt()会不会出问题
还有就是如果线程正在执行AMethod()的时候调用Interrupt()会不会出问题你唤醒后,马上又休眠,你真当CPU很闲吗?线程切换也是需要开销的。
还有就是如果线程正在执行AMethod()的时候调用Interrupt()会不会出问题你唤醒后,马上又休眠,你真当CPU很闲吗?线程切换也是需要开销的。
但是现在要的效果是这样的,唤醒为了执行AMethod()方法--》重新确定休眠时间--》休眠--》唤醒执行AMethod()方法--》重新确定休眠时间.....流程是这样的
还有就是如果线程正在执行AMethod()的时候调用Interrupt()会不会出问题
用定时器就不需要再“Interrupt()之后无法再sleep()”要实现通知,你定义一个事件event EventHandler Completed
在启动定时器之前,你注册一下完成后的事件处理
this.Completed += (obj, e) => AMethod();
var timer = System.Timers.Timer(6 * 1000);
timer.Elapsed += (obj, e) =>
{
AMethod();
//当执行完以后触发, 参数或者状态你可以放在e里面
if(this.Completed != null) this.Completed(...);
};
timer.Start();
还有就是如果线程正在执行AMethod()的时候调用Interrupt()会不会出问题
用定时器就不需要再“Interrupt()之后无法再sleep()”要实现通知,你定义一个事件event EventHandler Completed
在启动定时器之前,你注册一下完成后的事件处理
this.Completed += (obj, e) => AMethod();
var timer = System.Timers.Timer(6 * 1000);
timer.Elapsed += (obj, e) =>
{
AMethod();
//当执行完以后触发, 参数或者状态你可以放在e里面
if(this.Completed != null) this.Completed(...);
};
timer.Start();
这个考虑下,如果线程不行的话 试下这个
EventWaitHandle handler = new EventWaitHandle(false, EventResetMode.AutoReset);
线程的函数a
void a()
{
......其它代码
AMethod();
handler.WaitOne(休眠的时间);
}
这样的话,你想线程快速的醒来,只要Handler.Set()一下就Ok了,
{
doSth();
setSleepTime(1, 5760);
handler.WaitOne(sleepTime, false);
}
线程还是一直在跑的,没有休眠
但是线程是一直在跑的把你的代码贴出来吧,看看sleepTime在哪里定义的
但是线程是一直在跑的把你的代码贴出来吧,看看sleepTime在哪里定义的/// <summary>
/// 设置休眠时间
/// </summary>
/// <param name="day">天数</param>
/// <param name="count">次数</param>
private static void setSleepTime(int day, int count)
{
int minCount = day*24*60; //day天总共分钟数
int perMin = minCount/count; //时间间隔xx分钟 int days = perMin / 1440; //天数
int hours = (perMin - days * 1440) / 60; //小时数
int mins = perMin - days*1440 - hours*60; //分钟数
sleepTime = new TimeSpan(days, hours, mins, 0);
}
但是线程是一直在跑的把你的代码贴出来吧,看看sleepTime在哪里定义的/// <summary>
/// 设置休眠时间
/// </summary>
/// <param name="day">天数</param>
/// <param name="count">次数</param>
private static void setSleepTime(int day, int count)
{
int minCount = day*24*60; //day天总共分钟数
int perMin = minCount/count; //时间间隔xx分钟 int days = perMin / 1440; //天数
int hours = (perMin - days * 1440) / 60; //小时数
int mins = perMin - days*1440 - hours*60; //分钟数
sleepTime = new TimeSpan(days, hours, mins, 0);
}
一看就知道你的SleepTime等于0,他还能停下来吗?
你为什么要搞的这么复杂, new TimeSpan(0,0,15);不就完事了吗?你自己断点看一下,是不是0,
但是线程是一直在跑的把你的代码贴出来吧,看看sleepTime在哪里定义的/// <summary>
/// 设置休眠时间
/// </summary>
/// <param name="day">天数</param>
/// <param name="count">次数</param>
private static void setSleepTime(int day, int count)
{
int minCount = day*24*60; //day天总共分钟数
int perMin = minCount/count; //时间间隔xx分钟 int days = perMin / 1440; //天数
int hours = (perMin - days * 1440) / 60; //小时数
int mins = perMin - days*1440 - hours*60; //分钟数
sleepTime = new TimeSpan(days, hours, mins, 0);
}
一看就知道你的SleepTime等于0,他还能停下来吗?
你为什么要搞的这么复杂, new TimeSpan(0,0,15);不就完事了吗?你自己断点看一下,是不是0,
不好意思 设计的是精确到分钟 所以我的测试是错误的 是00 现在按你这个方法OK了 谢谢
但是线程是一直在跑的把你的代码贴出来吧,看看sleepTime在哪里定义的/// <summary>
/// 设置休眠时间
/// </summary>
/// <param name="day">天数</param>
/// <param name="count">次数</param>
private static void setSleepTime(int day, int count)
{
int minCount = day*24*60; //day天总共分钟数
int perMin = minCount/count; //时间间隔xx分钟 int days = perMin / 1440; //天数
int hours = (perMin - days * 1440) / 60; //小时数
int mins = perMin - days*1440 - hours*60; //分钟数
sleepTime = new TimeSpan(days, hours, mins, 0);
}
一看就知道你的SleepTime等于0,他还能停下来吗?
你为什么要搞的这么复杂, new TimeSpan(0,0,15);不就完事了吗?你自己断点看一下,是不是0,
明天把其他代码整理下 效果应该可以实现
但是线程是一直在跑的把你的代码贴出来吧,看看sleepTime在哪里定义的/// <summary>
/// 设置休眠时间
/// </summary>
/// <param name="day">天数</param>
/// <param name="count">次数</param>
private static void setSleepTime(int day, int count)
{
int minCount = day*24*60; //day天总共分钟数
int perMin = minCount/count; //时间间隔xx分钟 int days = perMin / 1440; //天数
int hours = (perMin - days * 1440) / 60; //小时数
int mins = perMin - days*1440 - hours*60; //分钟数
sleepTime = new TimeSpan(days, hours, mins, 0);
}
一看就知道你的SleepTime等于0,他还能停下来吗?
你为什么要搞的这么复杂, new TimeSpan(0,0,15);不就完事了吗?你自己断点看一下,是不是0,
不好意思 设计的是精确到分钟 所以我的测试是错误的 是00 现在按你这个方法OK了 谢谢
记得给分就成。哈哈。