zoukankan      html  css  js  c++  java
  • C# winform 多线程异步操作线程启动暂停与恢复

            /// <summary>
            /// 线程控制模块
            /// </summary>
            private ManualResetEvent manualResetEvent = new ManualResetEvent(false);
            /// <summary>
            /// 配合使用
            /// </summary>
            private AutoResetEvent autoResetEvent = new AutoResetEvent(true);
            private AsyncOperation asyncOperation = AsyncOperationManager.CreateOperation(null);
    
            /// <summary>
            /// 存储状态
            /// </summary>
            private bool suspend;
    
            /// <summary>
            /// 委托操作模块
            /// </summary>
            /// <param name="str"></param>
            private delegate void InvokeDelegate(string str);
            private delegate void InvokeMessage(int result);
            private delegate string[] InvokeMessageResult(int result);
            private delegate void InvokeListView(string oneValue, string twoValue, string threeValue, string four,string five);
            private delegate void InvokeMessageUI(string msg, string value);
            private delegate void InvokeMessageViewUI(string[] value);
            private delegate void InvokeExecute();
    
            /// <summary>
            /// 
            /// </summary>
            private bool formClosed = false;         
    
            private void btnDowload_Click(object sender, EventArgs e)
            {
                //启动下载任务
                if (this.btnDowload.Tag == null)
                {
                    ThreadPool.QueueUserWorkItem(delegate
                    {
                        ExecuteDownload(this.txtPath.Text);
                    });
                }
                else if (this.btnDowload.Tag.ToString() == "Run")
                {
                    this.suspend = true;
                    manualResetEvent.Reset();
                    //autoResetEvent.Reset();//另一种方式
    
                    //更改执行按钮状态
                    EvenInvokeButtionProcess("继续下载", "Reset");
                }
                else if (this.btnDowload.Tag.ToString() == "Reset")
                {
                    //
                    this.suspend = false;
                    manualResetEvent.Set();
                    //autoResetEvent.Set();//另一种方式
    
                    //更改执行按钮状态
                    EvenInvokeButtionProcess("暂停下载", "Run");
                }
                /** ----------------------------------------
                 * ThreadPool.QueueUserWorkItem(delegate
                 *   {
                 *       ExecuteDownload(this.txtPath.Text);
                 *   });
                 * -----------------挂起下载任务------------
                 *  this.suspend = true;
                 *  manualResetEvent.Reset();
                 *  //autoResetEvent.Reset();//另一种方式
                 *  -----------------唤醒下载任务-------------
                 *  this.suspend = false;
                 *  manualResetEvent.Set();
                 *  //autoResetEvent.Set();//另一种方式
                 ***/
            }
    
            /// <summary>
            /// 下载档案文件
            /// </summary>
            public void ExecuteDownload(string savePath)
            {
                //EvenInvokeButtionState("btnDowload", "false");
                //更改执行按钮状态
                EvenInvokeButtionProcess("暂停下载", "Run");
                //更改控件展示状态
                EvenInvokeButtionState("btnGet", "false");
                //初始化进度条
                EventInvokeProgresBarInit(0);
                //初始化进度条最大值
                int count = this.listView1.Items.Count;
                EventProgresMaximum(count);
                //this.listView1.Items 的下标从0开始,所以取值时,下标为 Count - 1
                for (int i = this.listView1.Items.Count; i > 0; i--)
                {
                    int rowIndex = 0;
                    //1.取得一条数据,
                    if (i == 0)
                    {
                        rowIndex = i;
                    }
                    else
                    {
                        rowIndex = i - 1;
                    }
                    /**
                    * this.listView1.Items 的下标从0开始,所以取值时,下标为 Count - 1,因为 Count 计数器,是从 1开始记录,所以相差1
                    * */
                    EventListViewSelected(rowIndex);
                    //获取列表
                    string[] ls = EventListViewGet(rowIndex);
                    //更新操作状态
                    EventInvokeListBoxText("---------------------------------------------------------", "");
                    EventInvokeListBoxText("开始下载:", ls[1].ToString() + "档案文件");
                    //更新比例
                    EventProgresTipText(count.ToString(), "/" + (rowIndex));
                    //执行下载操作
                    ExecuteDownload(ls[0].ToString(), ls[1].ToString(), savePath);
                    //将比对完成之后的数据移除
                    EventListViewRemoveAt(rowIndex);
                    //更新进度条状态
                    EventInvokeProgresBar(1);
                    //---------------------------------------------------------------------------
                    if (formClosed)
                    {
                        return;
                    }
                    //监听任务状态
                    if (suspend)
                    {
                        //更改执行按钮状态
                        EvenInvokeButtionProcess("继续下载", "Reset");
                        //挂起任务
                        this.manualResetEvent.WaitOne();
                    }
                    /** -------------------------另一种方式-------------------------------------
                     *  if (suspend)
                     *   {
                     *       this.autoResetEvent.WaitOne();
                     *   }
                     *   asyncOperation.Post(delegate { EventMessageBox(str); }, str);
                     **/
                }
                //更新进度条状态
                EventInvokeProgresBar(-100); //-100 为状态位
                //设置按钮状态
                EvenInvokeButtionState("btnGet", "true");
                //EvenInvokeButtionState("btnDowload", "true");
                //更改执行按钮状态
                EvenInvokeButtionProcess("文件下载", null);
                //数据加载完毕,设置提示信息
                EventInvokeListBoxText("---------------------------------------------------------","");
                EventInvokeListBoxText("执行状态:", "档案文件已经下载完毕,等待相关任务执行中.........");
            }
    
            /// <summary>
            /// 进度提示委托
            /// </summary>
            /// <param name="mes"></param>
            /// <param name="value"></param>
            public void EventInvokeListBoxText(string msg, string value)
            {
                this.Invoke(new InvokeMessageUI(InvokeListBoxText), new object[] { msg, value });
            }
    
            /// <summary>
            /// 进度提示条改变
            /// </summary>
            /// <param name="mes"></param>
            /// <param name="value"></param>
            public void InvokeListBoxText(string msg, string value)
            {
                if (this.listBox1.Items.Count == 0)
                {
                    this.listBox1.Items.Insert(0, msg + value);
                }
                else
                {
                    this.listBox1.Items.Insert(this.listBox1.Items.Count -1, msg + value);
                }
                //this.listBox1.SelectedIndex = this.listBox1.Items.Count - 1;
                this.listBox1.TopIndex = this.listBox1.Items.Count - (int)(this.listBox1.Height / this.listBox1.ItemHeight);
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="msg"></param>
            /// <param name="value"></param>
            private void EvenInvokeButtionProcess(string msg, string value)
            {
                this.Invoke(new InvokeMessageUI(InvokeButtionProcessUI), new object[] { msg, value });
            }
    
            private void InvokeButtionProcessUI(string msg, string value)
            {
                this.btnDowload.Tag = value;
                this.btnDowload.Text = msg;
            }
  • 相关阅读:
    STL_算法_查找算法(lower_bound、upper_bound、equal_range)
    Kafka深度解析
    hdoj 1027 Ignatius and the Princess II 【逆康托展开】
    代码二次封装-xUtils(android)
    C++11新特性应用--介绍几个新增的便利算法(用于排序的几个算法)
    谨防串行的状态报告会
    hadoop中NameNode、DataNode和Client三者之间协作关系及通信方式介绍
    Kindeditor JS 取值问题以及上传图片后回调等
    MySQL 8.0.11 报错[ERROR] [MY-011087] Different lower_case_table_names settings for server ('1')
    爱的链条
  • 原文地址:https://www.cnblogs.com/rinack/p/3257289.html
Copyright © 2011-2022 走看看