Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# 如何实施暂停&;使用BackgroundWorker c恢复功能#_C#_Backgroundworker_Manualresetevent - Fatal编程技术网

C# 如何实施暂停&;使用BackgroundWorker c恢复功能#

C# 如何实施暂停&;使用BackgroundWorker c恢复功能#,c#,backgroundworker,manualresetevent,C#,Backgroundworker,Manualresetevent,我想用BackgroundWorker实现暂停恢复和取消功能。我有一个单用户控件,所有与backgroundworker相关的代码都是用用户控件编写的。我只是在flow layout控件上添加了用户控件,只要用户单击按钮就可以了。我无法推动 暂停和恢复功能带有手动重置事件,但无论如何,我无法做到这一点。所以我在这里粘贴我的用户控件类相关代码和我的表单代码 public partial class ucBackgroundWorker : UserControl { System.Comp

我想用BackgroundWorker实现暂停恢复和取消功能。我有一个单用户控件,所有与backgroundworker相关的代码都是用用户控件编写的。我只是在flow layout控件上添加了用户控件,只要用户单击按钮就可以了。我无法推动 暂停和恢复功能带有手动重置事件,但无论如何,我无法做到这一点。所以我在这里粘贴我的用户控件类相关代码和我的表单代码

public partial class ucBackgroundWorker : UserControl
{
    System.ComponentModel.BackgroundWorker bgWorker = null;
    public event Action<string, EventArgs> Done;
    public event Action<string, EventArgs> Cancel;
    private static bool m_continue = true;
    private ManualResetEvent _resetEvent = new ManualResetEvent(false);
    //Semaphore sWaiter = new Semaphore(0, 1);

    public ucBackgroundWorker()
    {
        InitializeComponent();
        bgWorker = new System.ComponentModel.BackgroundWorker();
        bgWorker.WorkerSupportsCancellation = true;
        bgWorker.WorkerReportsProgress = true;
        bgWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        bgWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }

    public void Run(int counter)
    {
        if (!bgWorker.IsBusy)
        {
            bgWorker.RunWorkerAsync(counter);
        }
        _resetEvent.Set();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int input = int.Parse(e.Argument.ToString());

        this.BeginInvoke((MethodInvoker)delegate
        {
            lblStatus.Text = "Running";
        });

        for (int i = 1; i <= input; i++)
        {
            _resetEvent.WaitOne();
            Thread.Sleep(500);
            (sender as System.ComponentModel.BackgroundWorker).ReportProgress(i * 10);
            if ((sender as System.ComponentModel.BackgroundWorker).CancellationPending)
            {
                this.BeginInvoke((MethodInvoker)delegate
                {
                    lblStatus.Text = "Cancel";
                });

                e.Cancel = true;
                return;
            }
        }
        Thread.Sleep(1000);
    }


    // This event handler deals with the results of the 
    // background operation. 
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // First, handle the case where an exception was thrown. 
        if (e.Error != null)
        {
            MessageBox.Show(e.Error.Message);
        }
        else if (e.Cancelled)
        {
            if (Cancel != null)
                Cancel(this.Name, EventArgs.Empty);
        }
        else
        {
            this.BeginInvoke((MethodInvoker)delegate
            {
                lblStatus.Text = "Done";
            });

            if (Done != null)
                Done(this.Name, EventArgs.Empty);
        }
        _resetEvent.Reset();
    }

    // This event handler updates the progress bar. 
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        pBar.Refresh();
        pBar.Value = e.ProgressPercentage;
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        if (bgWorker.IsBusy)
        {
            bgWorker.CancelAsync();
        }
    }

    private void btnPause_Click(object sender, EventArgs e)
    {
        if (bgWorker.IsBusy)
        {
            if (btnPause.Text.ToUpper() == "PAUSE")
            {
                btnPause.Text = "Resume";
                m_continue = false;
                _resetEvent.Reset();
            }
            else if (btnPause.Text.ToUpper() == "RESUME")
            {

                btnPause.Text = "Pause";
                m_continue = true;
                _resetEvent.Set();

            }
        }
    }
}

    public partial class Form3 : Form
        {
            ucBackgroundWorker ucBgWorker = null;

            public Form3()
            {
                InitializeComponent();
            }

            private void btnStart_Click(object sender, EventArgs e)
            {
                ucBgWorker = new ucBackgroundWorker();
                ucBgWorker.Done += new Action<string, EventArgs>(Worker_Done);
                ucBgWorker.Cancel += new Action<string, EventArgs>(Worker_Cancel);
                flowLayoutPanel1.Controls.Add(ucBgWorker);
                ucBgWorker.Run(10);
            }

            void Worker_Done(string arg, EventArgs evtarg)
            {
                label1.Text =arg + " Done One";
                //System.Threading.Thread.Sleep(1000);
            }

            void Worker_Cancel(string arg, EventArgs evtarg)
            {
                label1.Text = arg + " Cancel Click";
                //System.Threading.Thread.Sleep(1000);
            }

        }
public分部类ucBackgroundWorker:UserControl
{
System.ComponentModel.BackgroundWorker bgWorker=null;
已采取的公共活动行动;
公众活动取消;
私有静态bool m_continue=true;
private ManualResetEvent _resetEvent=新的ManualResetEvent(错误);
//信号量交换器=新信号量(0,1);
公共ucBackgroundWorker()
{
初始化组件();
bgWorker=新系统.ComponentModel.BackgroundWorker();
bgWorker.WorkerSupportsScanCellation=true;
bgWorker.WorkerReportsProgress=true;
bgWorker.DoWork+=新的doworkenventhandler(后台工作1_DoWork);
bgWorker.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(backgroundWorker1\u RunWorkerCompleted);
bgWorker.ProgressChanged+=新的ProgressChangedEventHandler(backgroundWorker1\u ProgressChanged);
}
公共无效运行(整数计数器)
{
如果(!bgWorker.IsBusy)
{
bgWorker.RunWorkerAsync(计数器);
}
_resetEvent.Set();
}
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
int input=int.Parse(如Argument.ToString());
此.BeginInvoke((MethodInvoker)委托
{
lblStatus.Text=“正在运行”;
});

对于(int i=1;i向类中添加属性,该属性将保存bool-Sleep。订阅该更改,如果该更改为真,则将thread.Sleep设置为某个大数字,然后订阅该数字变为0,如果bool仍然为真,则再次将其设置为大数字。这就是我现在想到的,肯定有更好的方法。

基本上我想要实现t使用本课程中的ManualResetEvent完成暂停和恢复功能。无论如何,感谢您的提示。可能重复的