C# 恢复线程,同时操作另一个按钮
我是新来的。我在progressbar上找到了一些代码。当有人单击按钮startC# 恢复线程,同时操作另一个按钮,c#,multithreading,C#,Multithreading,我是新来的。我在progressbar上找到了一些代码。当有人单击按钮startbtnStartAsyncOperation\u click时,进度条开始增加,当按下btnCancel\u click时,取消操作。这是密码 namespace BackgroundWorkerSample { public partial class Form1 : Form { BackgroundWorker m_oWorker; public
btnStartAsyncOperation\u click
时,进度条开始增加,当按下btnCancel\u click
时,取消操作。这是密码
namespace BackgroundWorkerSample
{
public partial class Form1 : Form
{
BackgroundWorker m_oWorker;
public Form1()
{
InitializeComponent();
m_oWorker = new BackgroundWorker();
m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);
m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged);
m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(abcd);
m_oWorker.WorkerReportsProgress = true;
m_oWorker.WorkerSupportsCancellation = true;
}
void abcd(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
lblStatus.Text = "Task Cancelled.";
}
else if (e.Error != null)
{
lblStatus.Text = "Error while performing background operation.";
}
else
{
lblStatus.Text = "Task Completed...";
}
btnStartAsyncOperation.Enabled = true;
btnCancel.Enabled = false;
}
void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%";
}
void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
m_oWorker.ReportProgress(i);
if (m_oWorker.CancellationPending)
{
e.Cancel = true;
m_oWorker.ReportProgress(0);
return;
}
}
//Report 100% completion on operation completed
m_oWorker.ReportProgress(100);
}
private void btnStartAsyncOperation_Click(object sender, EventArgs e)
{
btnStartAsyncOperation.Enabled = false;
btnCancel.Enabled = true;
//Start the async operation here
m_oWorker.RunWorkerAsync();
}
private void btnCancel_Click(object sender, EventArgs e)
{
if (m_oWorker.IsBusy)
{
//Stop/Cancel the async operation here
m_oWorker.CancelAsync();
}
}
private void progressBar1_Click(object sender, EventArgs e)
{
}
private void lblStatus_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
}
}
}
namespace BackgroundWorkerSample
{
公共部分类Form1:Form
{
背景工人m_Owworker;
公共表格1()
{
初始化组件();
m_owworker=新的BackgroundWorker();
m_oWorker.DoWork+=新的doworkerventhandler(m_oWorker\u DoWork);
m_oWorker.ProgressChanged+=新的ProgressChangedEventHandler(m_oWorker\u ProgressChanged);
m_owworker.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(abcd);
m_oWorker.WorkerReportsProgress=真;
m_owworker.worker支持扫描单元=真;
}
无效abcd(对象发送方,RunWorkerCompletedEventArgs e)
{
如果(如已取消)
{
lblStatus.Text=“任务已取消。”;
}
否则如果(例如错误!=null)
{
lblStatus.Text=“执行后台操作时出错。”;
}
其他的
{
lblStatus.Text=“任务已完成…”;
}
btnStartAsyncOperation.Enabled=true;
btnCancel.Enabled=false;
}
void m_oWorker_ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
progressBar1.值=e.ProgressPercentage;
lblStatus.Text=“处理……”+progressBar1.Value.ToString()+“%”;
}
void m_oWorker_DoWork(对象发送方,doworkereventargs e)
{
对于(int i=0;i<100;i++)
{
睡眠(100);
m_oWorker.报告进度(i);
if(m_oWorker.CancellationPending)
{
e、 取消=真;
m_oWorker.ReportProgress(0);
返回;
}
}
//报告操作完成后100%完成
m_oWorker.报告进度(100);
}
私有void btnStartAsyncOperation\u单击(对象发送方,事件参数e)
{
btnStartAsyncOperation.Enabled=false;
btnCancel.Enabled=真;
//在这里启动异步操作
m_owworker.RunWorkerAsync();
}
私有void btnCancel\u单击(对象发送者,事件参数e)
{
如果(m_oWorker.IsBusy)
{
//在此停止/取消异步操作
m_oWorker.CancelAsync();
}
}
private void progressBar1_单击(对象发送者,事件参数e)
{
}
私有void lblStatus_单击(对象发送方,事件参数e)
{
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
}
}
}
现在我又添加了2个按钮,按钮1用于暂停,按钮2用于恢复。因为我找不到任何恢复的方法,所以当我按pause时,我必须使用CancelAsync()
函数,并将进度条的值保留在全局变量中。然后,当我按下resume时,我使用RunWorkerAsync
再次启动进度条。但问题是,我不能在这个函数中发送全局变量的值,所以它从0开始
我尝试在有人按暂停时使用thread.sleep(此处为无限时间)
,然后在有人按恢复时停止线程。但问题是,在这种情况下,我不能按任何按钮。如果我启用按钮,它们仍然不工作
请给我一些解决方案。您可以尝试使用自己的变量,即
bool isPaused = false;
当有人单击你的暂停按钮时
isPaused = true;
当有人单击resume时,将其设置为false。最后,在doWork方法中的for循环中,使其等待该变量为false
while (isPaused)
{
Thread.Sleep(100);
}
让我知道这对您有何影响。您可能应该查找异步/等待或反应式扩展。很适合这些类型的问题。@MeirionHughes你能给我一些链接吗