0
我是C#中的新成員。我發現了一些在進度條上工作的代碼。什麼是當有人點擊按鈕開始btnStartAsyncOperation_Click
進度條開始增加,當按下btnCancel_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)
{
}
}
}
現在我又添加了2個按鈕,button1暫停和button2恢復。由於我找不到任何恢復方法,因此在按暫停時我不得不使用CancelAsync()
函數,並將進度條的值保存在全局變量中。然後,當我按簡歷時,我再次使用RunWorkerAsync
開始進度欄。但問題是,我無法在此函數中發送全局變量的值,因此它從0進度開始。
我嘗試使用thread.sleep(infinite time here)
當有人按暫停,然後停止線程時,有人按簡歷。問題仍然是,在這種情況下我無法按任何按鈕。如果我啓用按鈕,他們不工作。
請給我一些解決方案。
你應該查找async/await或Reactive Extensions。非常適合這些類型的問題。 – 2013-03-16 19:09:24
@MeirionHughes您能否給我一些鏈接 – asdfkjasdfjk 2013-03-16 20:05:47