Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 恢复线程,同时操作另一个按钮_C#_Multithreading - Fatal编程技术网

C# 恢复线程,同时操作另一个按钮

C# 恢复线程,同时操作另一个按钮,c#,multithreading,C#,Multithreading,我是新来的。我在progressbar上找到了一些代码。当有人单击按钮startbtnStartAsyncOperation\u click时,进度条开始增加,当按下btnCancel\u click时,取消操作。这是密码 namespace BackgroundWorkerSample { public partial class Form1 : Form { BackgroundWorker m_oWorker; public

我是新来的。我在progressbar上找到了一些代码。当有人单击按钮start
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你能给我一些链接吗