public partial class Form1 : Form
{
public bool flag = true;
public Form1()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
} private void button1_Click(object sender, EventArgs e)
{
if (flag == true)
{
flag = false;
}
else
{
flag = true;
}
} private void Form1_Load(object sender, EventArgs e)
{
Thread th = new Thread(s);
th.Start();
}
private void s()
{
int i = 0;
while (flag)
{
label1.Text = i.ToString();
i++;
}
} private void button2_Click(object sender, EventArgs e)
{
label1.Text = "abc";
}
}
在我点击button1的时候,label1上的数字停止了增长,但是我再次点击button1,数字却不继续增长了(label1不再更新了)。为什么呢?我想用线程解决一个问题,在线程调用的方法里面,有一个for,for里面有一系列的操作,我想要在点击某个按钮的时候,暂停这个线程,同时又保证for里面一个系列的操作都完成再暂停,请问有办法解决吗?用我上面那个办法可以吗?刚注册的csdn,分有些少,请见谅。
解决方案 »
- |ZYCWPF| Interaction.Triggers 触发后台属性更新后台属性时报错的总题,有示例
- SendMessage方法如何传递按键消息
- 获取字符串中的最右边字符
- C#里的线程问题
- C#中如何判断标点符号
- 怎么这样的sql
- DllImport 异常Unable to find an entry point named 'GLY_DepositFixEvent' in DLL
- winfrom判断勾选弹出提示
- 如何实现http连接加密?(欢迎讨论)
- 提问一个菜鸟级的问题!开发C#用Visual Studio.Net 里的那个工具?
- 类型转换?
- 用while continue实现计算从1到100之间的除了能被7整除之外所有整数的和
{
int i = 0;
while(true)
{
while (flag)
{
label1.Text = i.ToString();
i++;
}
thread.sleep(50);
}
}
借用一句流行的火星语言体:凡是在线程中搞for循环并且外边搞什么暂停的,都是耍流氓!你可以在你的控制流程中,让线程结束,然后在创建新的线程。用不着搞什么“暂停”。线程编程最忌讳的就是什么胡乱“阻塞”的做法。阻塞会随随便便就造成系统严重的死锁问题(或者至少是非常“卡”的问题)。因此“从来不阻塞”,才是线程流程设计的诀窍。因此,如果你想所谓“暂停”它,那么就结束它,而不是暂停它。
简单点的话,暂停线程使用 suspend 和resume 方法,对于完成操作才结束线程,这个需要一个变量来控制,即给一个变量让线程内检测这个变量,一定值的时候在适当的部位结束所在线程。当然如果在暂停的时候结束这个线程则一定要先改变变量的值,然后继续线程,否则线程suspend在那里是不能检测变量的,而且有可能会多出几次循环。刚给你改了代码,结果不熟悉引用这个东西,引用了下,全没了,。
复杂点就用线程池按照3L的过程做了。