在一个form中,有一个timer触发的事件,里面有一个循环,要执行的东西较多,每次按暂停都要等本次timer事件结束才能反应,实时性太差,我希望在循环里能够判断按钮是否按下,如果按下了,本次timer事件就结束。百度了很久,没有找到办法,向兄弟们求助,谢谢大家!
解决方案 »
- 求C#CHM帮助文档
- 关于EntityFramework操作表间有外键的数据库造成循环引用的BUG
- 求C# 高性能的图像锐化算法。flickr的锐化效果非常好啊。。。
- 最近做权限管理模块,大家给些思路
- [Windows API]msdn上关于RegisterHotKey函数的remarks部分的疑问
- DataList绑定集合类,怎么写??
- 修改系统打印机的自定义纸张的大小
- 新手关于vc#画图的问题--高分
- 用c#将一个数据表导出成excel文件,web方式
- 打包问题之2:我用微软的DotNetSetup1.1.zip来把.net框架包含进去,可是出错了
- H264编码文件如何转换成RTMP文件,求指教,用C#
- 简单Linq问题,OData查询的 进来结贴给分 在线等 ~~~~!! [问题点数:88分]
点下时置为false
timer中处理的时候判断一下
while(变量)
{
}
{
public partial class Form1 : Form
{
private Action<int> actionSetText;
private System.Threading.Thread thread;
Boolean pause = true;
public Form1()
{
InitializeComponent();
actionSetText = setText;
button1_Click(null, null);
}
private void button1_Click(object sender, EventArgs e)
{
pause = !pause;
this.timer1.Enabled = !pause;
if (pause)
{
button1.Text = "暂停";
}
else
{
button1.Text = "运行";
}
}
private void work()
{
for (int i=0; i < 1000; i++)
{
System.Threading.Thread.Sleep(10);//替换成你要进行的后台操作
this.Invoke(actionSetText, new Object[1] { i });
while (pause)
{
System.Threading.Thread.Sleep(100);
}
}
}
private void setText(int i)//替换成你要进行的前台操作
{
this.Text = i.ToString();
} private void timer1_Tick(object sender, EventArgs e)
{
if (thread != null)
{
if (thread.IsAlive)
{
return;
}
}
thread = new System.Threading.Thread(work);
thread.Start();
}
}
}
基本思路是:
1.钟定时准备开启线程 thread 在后台工作,但前提是上一个操作已经完成了.
if (thread != null)
{
if (thread.IsAlive)
{
return;
}
}
这里判断上一个线程是否执行完.2.线程thread 用于执行 work 方法
thread = new System.Threading.Thread(work);
因此你原来的大部分工作代码要放置在work方法中。3.在work方法执行的最细粒度中(最内侧循环)放置死循环响应暂停
while (pause)
{
System.Threading.Thread.Sleep(100);
}4.需要注意的是,虽然大部分代码移植到work 方法就可以了,但线程中的代码不可访问用户界面(将导致不一致性),因此如果你原来的代码在操作用户界面(比如我这里操作窗口标题),那么需要用到委托和在主线程运行委托的概念。
4.1.将前台操作代码放置在一个函数中,如:
private void setText(int i)
{
this.Text = i.ToString();
}4.2.创建setText方法的委托用于在当前线程执行它
private Action<int> actionSetText;是一个委托,它代表setText方法:
actionSetText = setText;
Action<int> 是指带有一个int的参数的无返回值的方法,这要与被委托的setText方法一致。
(带有返回值的委托可以用Fun)
4.3.在work方法中,把涉及前台操作的代码用在当前线程调用委托的方法实现:
this.Invoke(actionSetText, new Object[1] { i });
new Object[1] { i }是参数集合,即setText的参数i。