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)
        {

        }
        }
    }

ここで、ボタン 1 を一時停止し、ボタン 2 を再開する 2 つのボタンを追加しました。再開する方法が見つからなかったので、CancelAsync()一時停止を押したときに関数を使用する必要があり、進行状況バーの値をグローバル変数に保持しました。次に、再開を押すと、を使用して進行状況バーを再度開始しRunWorkerAsyncます。しかし、問題は、この関数でグローバル変数の値を送信できないため、進行状況が 0 から始まることです。

thread.sleep(infinite time here)誰かが一時停止を押したときに使用しようとし、誰かが再開を押したときにスレッドを停止しました。それでも問題は、この状況でボタンを押すことができないことです。それでもボタンを有効にしても機能しません。

解決策を教えてください。

4

1 に答える 1

0

独自の変数を試すことができます。つまり、

bool isPaused = false;

誰かがあなたの一時停止ボタンをクリックすると...

isPaused = true;

誰かが再開をクリックしたときに false に設定します。最後に、doWork メソッドの for ループで、その変数が false になるまで待機させます。

while (isPaused) 
{
    Thread.Sleep(100);
}

これがどのように機能するか教えてください。

于 2013-03-16T18:25:46.643 に答える