1: 因为程序涉及到上传,开始暂停,继续,删除, thread 在老版本用使用th.Abort(); th.Resume(); 停止 恢复 th.Suspend(); 挂起
猛的一看挺合适啊..但微软已经明确指出已经过时了. 在使用的过程中,几个状态来回切换几次,很容易出现问题, 判断了好多种状态,最后还是报异常.所以这种方式不建议用了,尽管强用还可以用,但用起来非常的不流畅.
比如下边大家看看单单状态的判断
else if(th.ThreadState == (ThreadState.Background | ThreadState.Suspended)) { th.Resume(); th.Abort(); this.gridView1.DeleteSelectedRows(); Console.WriteLine("线程终止"); }
下边
if (th.ThreadState == (ThreadState.Background | ThreadState.Running))
{
th.Suspend();
Console.WriteLine("线程挂起");
}
就这样加上了,程序还是会出现异常.所以淘汰了应该处于上边的原因吧.
2:那既然不能用了.该用什么呢? 可以用thread 加信号机制的方式实现附加一个程序
namespace Test { public partial class Form4 : Form { public Form4() { InitializeComponent(); Label.CheckForIllegalCrossThreadCalls = false; } Thread thread; ManualResetEvent ma; bool on_off = false; bool stop = false; private void button1_Click(object sender, EventArgs e) { thread = new Thread(Runtime); thread.Start(); } void Runtime() { for (int i = 1; i <= 100; i++) { if (stop) return; if (on_off) { ma = new ManualResetEvent(false); ma.WaitOne(); } textBox1.AppendText("计时 :" + i + " "); Thread.Sleep(100); } } private void button2_Click(object sender, EventArgs e) { on_off = true; textBox1.AppendText("暂停中 : "); } private void button3_Click(object sender, EventArgs e) { on_off = false; ma.Set(); textBox1.AppendText("继续计时 : "); } private void button4_Click(object sender, EventArgs e) { stop = true; textBox1.AppendText("停止计时 "); } } }
上边 配合on off 有个 ma.set() 发送信号,相当于地铁的入站口刷卡. ma.waitone () 程序暂停处 相当于那个档子, set 刷卡, 档子撤开,程序继续进行下一步.