比如写到184个文件的时候,我在GUI上点击暂停,然后b把这第184个文件写完,暂停;下次就从第185个文件开始写
解决方案 »
- 有几个page页面,如何实现点击page1上的按钮调出page2?
- 用C#合并Excel表格问题
- winform datagrid 父子关系表中的 导航头的“向后定位到父行”的提示内容能换掉吗?
- 2008年要去美国洛杉矶了
- 分享:OPC程序在调用IOPCServer.AddGroup时报错“值不在预期范围内”
- [分享]C# 大宝宝IP地址便捷修改器 v1.0
- 信息转发的问题,大家都进来帮忙看看,谢谢
- C#后台的json该怎么传到前台,前台又该如何接收呢?求大神指点。
- 各位:如果我使用通过Email注册成功的水晶报表发放给客户,会有什么不妥甚至问题?
- IIS打开网站出错
- vs2013写的代码上传到svn上,同事下载下来,需手动添加
- C#里面 double类型变量如何保留超过15位小数?
在A类定义一个布尔变量
bool IsStop = false;
开启线程代码改成void ThreadRun()
{
while (!IsStop)
{
b.doSomething();
}
}
thread = new Thread(new ThreadStart(ThreadRun));当按钮点击暂停的时候,执行
IsStop = true;
除非你不要用while死循环,而采用面向对象的思想,引入事件的机制
而office生成一个临时文件,是用来保存你当前改动的,即使你没保存文件直接关机,下次打开的时候也会提示你可以恢复,而不是所有更改全部丢失
写了个console方式的例子,支持暂停、继续、取消:var cts = new CancellationTokenSource(); // cts用来取消任务
var ev = new ManualResetEventSlim(true); // ev用来暂停/继续任务
var t = new Thread(() => {
while (!cts.Token.IsCancellationRequested)
{
Console.Write("."); Thread.Sleep(100); // 模拟任务
try
{
ev.Wait(cts.Token); // 等待ev,等待中可接受取消
}
catch(OperationCanceledException)
{
break;
}
}
});
t.Start();while (true)
{
if (Console.ReadKey(true).KeyChar == 'q')
{
// 按 q 键退出,退出前取消任务并等待工作线程彻底结束
cts.Cancel();
t.Join();
return;
} // 按其它键切换暂停/继续
if (ev.IsSet)
ev.Reset();
else
ev.Set();
}
见http://support.microsoft.com/kb/211632,简单说就是为了性能和数据安全。关于数据安全,或者说原子方式写文件,见http://blogs.msdn.com/b/adioltean/archive/2005/12/28/507866.aspx,最后有一个很长的步骤。VS保存文件的时候就是这样的,见http://bbs.csdn.net/topics/390964853。Word之类没测试过,不过我估计也是这样。
而且我也没有限制说不让用事件的机制啊……愿闻其详
我也不是让当前线程“等待”,就是“暂停”一下,就在内存里放着,这总行吧,也不占CPU。这个做不到吗
当执行了IsStop = true;之后,便跳出了那个while循环,故此方法不正确
tempstop 暂停
Stop 停止
{
while (!IsStop)
{
b.doSomething();
while(tempstop&&!IsStop){Thread.Sleep(50);}
}
}
thread = new Thread(new ThreadStart(ThreadRun));
其实你不如把线程里使用的局部变量都定义成全局变量,这样即使线程退出了,所有变量也都还在,用不着自己想办法把大量变量自己保存.
或者你像楼上说的,用ManualResetEvent类