单线程中如何判断线程是开始还是暂停 ManualResetEvent通过信号量来控制线程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public partial class Form1 : Form { Thread th1; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (th1 == null) { th1 = new Thread(Thread1); th1.IsBackground = true; th1.Start(); } else if ((th1.ThreadState & ThreadState.Suspended) == ThreadState.Suspended) { th1.Resume(); } } private void Thread1() { int i = 0; Action a = ()=>this.richTextBox1.Text = i.ToString(); while (true) { ++i; Thread.Sleep(1000); this.Invoke(a); } } private void btnPause_Click(object sender, EventArgs e) { th1.Suspend(); } } Button1是开始btnPause是暂停,循环往richTextBox1打数字,就是利用suspend和resume方法。。不知道是不是你要的效果 而且所谓线程暂停,应该是暂停线程里面的代码逻辑而只有在while循环的时候才需要所谓的暂停,没有循环的话,线程一下就跑完了所以循环里面加个if就好了,如果是暂停状态,就执行sleep 谢谢@wmg494005678 你发的代码跟我想要的效果差不多 代码也很全面非常感谢你 @Z65443344 你发给 我的逻辑很清晰也很好也非常感谢你 protected Thread thTest = null; protected void btnRunOrPause_Click(object sender, EventArgs e) { if (thTest == null) { thTest = new Thread(new ThreadStart(RunOrPauseThread)); thTest.IsBackground = true; thTest.Start(); } else { switch ((int)thTest.ThreadState) { case (int)ThreadState.Running: thTest.Suspend(); break; case (int)ThreadState.Suspended: thTest.Resume(); break; default: break; } } } protected void RunOrPauseThread() { // do something } 线程的暂停,继续,看楼上的好像貌似 写的比我简单的多的啊 BackgroundWorker bw = null; //创建ManualResetEvent ManualResetEvent mr = new ManualResetEvent(true);//启动背景线程 private void button1_Click(object sender, EventArgs e) { CP_load.Visible = true; bw = new BackgroundWorker(); bw.WorkerSupportsCancellation = true; bw.WorkerReportsProgress = true; bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); bw.RunWorkerAsync(); }//暂停继续 private void button3_Click(object sender, EventArgs e) { Button b = (Button)sender; if (b.Text == "暂停") { mr.Reset(); b.Text = "继续"; } else { mr.Set(); b.Text = "暂停"; } } //线程中执行事件,控制暂停继续的地方 void bw_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i <= 1000; i++) { if (bw.CancellationPending) { e.Cancel = true; return; } this.Invoke((MethodInvoker)delegate { this.richTextBox1.Text += i + Environment.NewLine; }); bw.ReportProgress(i,i); //接受指令 mr.WaitOne(); } }//及时返回 百分比到UI上,更新UI。 void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { CP_load.Value = (int)(((double)e.ProgressPercentage / (double)1000 * 100)); CP_load.ProgressText = CP_load.Value.ToString(); if (CP_load.Value == 100) { CP_load.Visible = false; } } 在combox中如何显示小类目前空格 请教 请问怎么更改DataGridView的列类型? asp.net 2.0 GridView导出到Excel之前怎样把"自动套用格式"套用的格式去掉再导出? 自定义toolbar 这两是不是都是同一个用途,用来在传输数据前检查是否有可用数据??? 空字符如何表示 求:如何去掉TreeViewer的横向滚动条 添加菜单图标 Dev Express ComboBoxEdit控件 使用域服务器中的服务,身份认证问题。 C语言指针转C#语言
{
Thread th1;
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
if (th1 == null)
{
th1 = new Thread(Thread1);
th1.IsBackground = true;
th1.Start();
}
else if ((th1.ThreadState & ThreadState.Suspended) == ThreadState.Suspended)
{
th1.Resume();
} } private void Thread1()
{
int i = 0;
Action a = ()=>this.richTextBox1.Text = i.ToString();
while (true)
{
++i;
Thread.Sleep(1000);
this.Invoke(a);
}
} private void btnPause_Click(object sender, EventArgs e)
{
th1.Suspend();
}
}
而只有在while循环的时候才需要所谓的暂停,没有循环的话,线程一下就跑完了
所以循环里面加个if就好了,如果是暂停状态,就执行sleep
@Z65443344 你发给 我的逻辑很清晰也很好也非常感谢你
protected Thread thTest = null; protected void btnRunOrPause_Click(object sender, EventArgs e)
{
if (thTest == null)
{
thTest = new Thread(new ThreadStart(RunOrPauseThread));
thTest.IsBackground = true;
thTest.Start();
}
else
{
switch ((int)thTest.ThreadState)
{
case (int)ThreadState.Running:
thTest.Suspend();
break;
case (int)ThreadState.Suspended:
thTest.Resume();
break;
default: break;
}
}
} protected void RunOrPauseThread()
{
// do something
}
BackgroundWorker bw = null;
//创建ManualResetEvent
ManualResetEvent mr = new ManualResetEvent(true);//启动背景线程
private void button1_Click(object sender, EventArgs e)
{
CP_load.Visible = true; bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.WorkerReportsProgress = true; bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); bw.RunWorkerAsync(); }//暂停继续
private void button3_Click(object sender, EventArgs e)
{
Button b = (Button)sender;
if (b.Text == "暂停")
{
mr.Reset();
b.Text = "继续";
}
else
{
mr.Set();
b.Text = "暂停";
} } //线程中执行事件,控制暂停继续的地方
void bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 1000; i++)
{
if (bw.CancellationPending)
{
e.Cancel = true;
return;
}
this.Invoke((MethodInvoker)delegate
{
this.richTextBox1.Text += i + Environment.NewLine;
});
bw.ReportProgress(i,i); //接受指令
mr.WaitOne();
}
}
//及时返回 百分比到UI上,更新UI。
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
CP_load.Value = (int)(((double)e.ProgressPercentage / (double)1000 * 100));
CP_load.ProgressText = CP_load.Value.ToString(); if (CP_load.Value == 100)
{
CP_load.Visible = false;
} }