线程同步的一个问题 本帖最后由 maomao85 于 2014-10-09 10:32:50 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用ManualResetEvent ,自己在man的方法上加try..catch..//启动线程 Thread th = new Thread(new ThreadStart(() => { while (true) { man.WaitOne(); Console.WriteLine("*****"); } })); th.IsBackground = true; th.Start();//控制方法的执行、停止 ManualResetEvent man = new ManualResetEvent(false); bool flag = false; private void button3_Click(object sender, EventArgs e) { if (!flag) { man.Set(); flag = true; } else { man.Reset(); flag = false; } } 不是我要的效果啊,ManualResetEvent man = new ManualResetEvent(false)一开始就无信号不对啊。因为一开始我的线程就是要不停执行某件事啊,不能一开始就阻塞在man.WaitOne() 你的DoSomeThing如果耗时很长,那么在正在执行的过程中,当然是没办法停下来的除非DoSomeThing本身里面也是for循环之类的,你可以在最内层的循环判断你的变量,直接return出来 或者你就是要停止一个没有响应了的线程(比如正因为IO通信阻塞中),可以在外部执行线程.Abort(); 把逻辑改一下不就可以了 ManualResetEvent man = new ManualResetEvent(true); bool flag = false; private void button3_Click(object sender, EventArgs e) { if (!flag) { man.Reset(); flag = true; } else { man.Set(); flag = false; } } //运行到这,由于cpu的分时,转去执行线程了 看这一段相当于还是没有用啊 我测试遇到的问题是,我的DoSomeThing执行完了。然后准备执行下一轮的DoSomeThing时,按下了Stop。可是没有及时修改flag,导致下一轮的DoSomeThing还是被执行了。不知道我说明白了没有。DoSomeThing函数还在执行中肯定是没法停止的,这点我知道。我只是需要还没有执行DoSomeThing的时候,按下Stop是可以及时停止 我测试遇到的问题是,我的DoSomeThing执行完了。然后准备执行下一轮的DoSomeThing时,按下了Stop。可是没有及时修改flag,导致下一轮的DoSomeThing还是被执行了。不知道我说明白了没有。DoSomeThing函数还在执行中肯定是没法停止的,这点我知道。我只是需要还没有执行DoSomeThing的时候,按下Stop是可以及时停止这个跟CPU是否分时,还是你弄128个核的CPU,所有线程占有一个核,完全并行,没有任何关系你手点的速度,跟CPU执行的速度,能比吗你点的稍微慢0.01ms,它就已经开始执行了,懂了?除非你在它执行第一次,还没执行完的时候,就已经点下去了,这样它就不执行第二次了你想正好卡在第一次和第二次之间点下去,你觉得现实吗? Quote: 引用 9 楼 Z65443344 的回复:这个跟CPU是否分时,还是你弄128个核的CPU,所有线程占有一个核,完全并行,没有任何关系你手点的速度,跟CPU执行的速度,能比吗你点的稍微慢0.01ms,它就已经开始执行了,懂了?除非你在它执行第一次,还没执行完的时候,就已经点下去了,这样它就不执行第二次了你想正好卡在第一次和第二次之间点下去,你觉得现实吗?[/quote你的意思就是在这个时间点按下按钮的概率很低? 是的.非常非常低.你的代码执行时间应该很长,至少比起两次执行之间的那点缝隙来说是足够长而一次执行完,执行下一次,只不过是一个CPU执行周期你想在这个时间点上点下按钮并修改变量的值,除非你是超人. 你如果想两次执行之间能够操作,起码加个足够长的sleep来允许操作吧你这样不断的一次一次执行,怎么可能正好在两次执行之间点下按钮呢 你的设计有问题,这样会好的多,但是也不会立即退出while(true){ if(!flag) break; dosometing();}线程的立即退出是有可能出现其他错误的,严重的时候导致你的数据丢失。 if(flag){Thread.Abort();}flag=false;这样不挺好的 线程退出就好比寿终正寝,而强制Abort就跟枪杀一样,是很暴力的做法你应该通知它:你快死了,赶紧写好遗嘱,买好棺材,然后找个人把你埋了而不是不管三七二十一,一枪打死,然后再想办法给它擦屁股 好象线程自己没有立即停止的办法,除非线程外部强行终止,用TerminateThread Function 这样好在哪里?请指教?这样写,好处就是,你可以在不同的地方执行break,而不一定每次都必须完整的执行完一次才能结束 滥用“无限循环”的习惯会让你的 UI 程序反应很慢、“卡得令人受不了”,而这个时候你再去纠结“按下Stop后及时改变flag”,这就是恶性循环了。 无限循环其实也没那么可怕吧,很多时候还是需要用到的比如我就做个检测丢包率的软件,按下开始就不断的发送接收,或者干脆就是不断的ping,按下停止结束并计算丢包率这里用while没什么问题吧 @Z65443344,这位同行诠释的很好,楼主试图和CPU分时比速度,如你你赢,你自己则就是一台超级计算机。 其实我是个for循环,只是for循环里面的DoSomeThing比较耗时。 这样一点都不好如果线程里有跟数据库通信,或线程里调用了非托管资源你这样直接强制退出,会产生一堆问题的应该先通知线程:你应该退出了然后线程把该释放的释放,该关闭的关闭,再自己退出我是做的一个xy水平平台动作的,在点到点运动的过程中。判断到了定点就停止 用的这个abort。好不好 你的业务逻辑到底是否要关心“退出”标志呢?如果不关心,那么它是否关心“安全结束”呢?还是任何语句抛出了异常,也当作没看见bug呢? 非结构化编程是什么?非结构化,这个词是杜撰,呵呵所谓结构化,就是单步调试能够一步步下来的;非结构化,就是直接F10(visual studio),不能按照你的意愿跳转代码。 肯定关系退出啊。我是一个for循环,一次一次的向硬件设备发https请求来完成一些信息的交互。肯定得安全结束。点stop就是表示停止这个for循环 鼠标进入按钮后,按钮慢慢变成高亮的那种效果,是什么属性控制的? 谁给介绍一个参考源码 服务器报错提示:servers unavailable c# 写了一个windows服务程序, 如何实现让windows 服务本身实现重新启动? 如何更改IE的语言设定,在线等!!!!!!!!!!!!高分求救 求关于treeview的存储过程。 C#里如何让一个事件函数动态的让按钮点击触发。 求倉存sql語句問題 timer的问题 谁有ORACLE815的下载地址(急)在线等待,发现立即给分 关于mojitor.enter()的使用疑惑 MVVM中TextBox绑定int类型值的问题
Thread th = new Thread(new ThreadStart(() =>
{
while (true)
{
man.WaitOne();
Console.WriteLine("*****");
}
}));
th.IsBackground = true;
th.Start();//控制方法的执行、停止
ManualResetEvent man = new ManualResetEvent(false);
bool flag = false;
private void button3_Click(object sender, EventArgs e)
{
if (!flag)
{
man.Set();
flag = true;
}
else
{
man.Reset();
flag = false;
}
}
除非DoSomeThing本身里面也是for循环之类的,你可以在最内层的循环判断你的变量,直接return出来
线程.Abort();
bool flag = false;
private void button3_Click(object sender, EventArgs e)
{
if (!flag)
{
man.Reset();
flag = true;
}
else
{
man.Set();
flag = false;
}
}
相当于还是没有用啊
DoSomeThing函数还在执行中肯定是没法停止的,这点我知道。
我只是需要还没有执行DoSomeThing的时候,按下Stop是可以及时停止
DoSomeThing函数还在执行中肯定是没法停止的,这点我知道。
我只是需要还没有执行DoSomeThing的时候,按下Stop是可以及时停止
这个跟CPU是否分时,还是你弄128个核的CPU,所有线程占有一个核,完全并行,没有任何关系
你手点的速度,跟CPU执行的速度,能比吗
你点的稍微慢0.01ms,它就已经开始执行了,懂了?
除非你在它执行第一次,还没执行完的时候,就已经点下去了,这样它就不执行第二次了
你想正好卡在第一次和第二次之间点下去,你觉得现实吗?
你的代码执行时间应该很长,至少比起两次执行之间的那点缝隙来说是足够长
而一次执行完,执行下一次,只不过是一个CPU执行周期
你想在这个时间点上点下按钮并修改变量的值,除非你是超人.
你这样不断的一次一次执行,怎么可能正好在两次执行之间点下按钮呢
{
if(!flag) break;
dosometing();
}线程的立即退出是有可能出现其他错误的,严重的时候导致你的数据丢失。
{
Thread.Abort();
}
flag=false;
这样不挺好的
你应该通知它:你快死了,赶紧写好遗嘱,买好棺材,然后找个人把你埋了
而不是不管三七二十一,一枪打死,然后再想办法给它擦屁股
这样写,好处就是,你可以在不同的地方执行break,而不一定每次都必须完整的执行完一次才能结束
比如我就做个检测丢包率的软件,按下开始就不断的发送接收,或者干脆就是不断的ping,按下停止结束并计算丢包率
这里用while没什么问题吧
如果线程里有跟数据库通信,或线程里调用了非托管资源
你这样直接强制退出,会产生一堆问题的
应该先通知线程:你应该退出了
然后线程把该释放的释放,该关闭的关闭,再自己退出我是做的一个xy水平平台动作的,在点到点运动的过程中。判断到了定点就停止 用的这个abort。好不好
你的业务逻辑到底是否要关心“退出”标志呢?如果不关心,那么它是否关心“安全结束”呢?还是任何语句抛出了异常,也当作没看见bug呢?
所谓结构化,就是单步调试能够一步步下来的;非结构化,就是直接F10(visual studio),不能按照你的意愿跳转代码。
肯定得安全结束。
点stop就是表示停止这个for循环