/// <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();
//初始化进度条最大值
int count = this.listView1.Items.Count;
EventProgresMaximum(count);
//this.listView1.Items 的下标从0开始,所以取值时,下标为 Count - 1
for (int i = this.listView1.Items.Count; i > ; i--)
{
int rowIndex = ;
//1.取得一条数据,
if (i == )
{
rowIndex = i;
}
else
{
rowIndex = i - ;
}
/**
* this.listView1.Items 的下标从0开始,所以取值时,下标为 Count - 1,因为 Count 计数器,是从 1开始记录,所以相差1
* */
EventListViewSelected(rowIndex);
//获取列表
string[] ls = EventListViewGet(rowIndex);
//更新操作状态
EventInvokeListBoxText("---------------------------------------------------------", "");
EventInvokeListBoxText("开始下载:", ls[].ToString() + "档案文件");
//更新比例
EventProgresTipText(count.ToString(), "/" + (rowIndex));
//执行下载操作
ExecuteDownload(ls[].ToString(), ls[].ToString(), savePath);
//将比对完成之后的数据移除
EventListViewRemoveAt(rowIndex);
//更新进度条状态
EventInvokeProgresBar();
//---------------------------------------------------------------------------
if (formClosed)
{
return;
}
//监听任务状态
if (suspend)
{
//更改执行按钮状态
EvenInvokeButtionProcess("继续下载", "Reset");
//挂起任务
this.manualResetEvent.WaitOne();
}
/** -------------------------另一种方式-------------------------------------
* if (suspend)
* {
* this.autoResetEvent.WaitOne();
* }
* asyncOperation.Post(delegate { EventMessageBox(str); }, str);
**/
}
//更新进度条状态
EventInvokeProgresBar(-); //-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 == )
{
this.listBox1.Items.Insert(, msg + value);
}
else
{
this.listBox1.Items.Insert(this.listBox1.Items.Count -, 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;
}

C# winform 多线程异步操作线程启动暂停与恢复的更多相关文章

  1. Java多线程之线程的暂停

    Java多线程之线程的暂停 下面该稍微休息一下了呢……不过,这里说的是线程休息,不是我们哦.本节将介绍一下让线程暂停运行的方法. 线程Thread 类中的sleep 方法能够暂停线程运行,Sleep ...

  2. 利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复(转)

    利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复 打印过程可能很长,这时候有可能需要暂停下来做一些事情,然后回来继续接着打印 打印过程中有2个线程:一个是程序运行的主线程, ...

  3. ManualResetEvent实现线程的暂停与恢复

    背景 前些天遇到一个需求,在没有第三方源码的情况下,刷新一个第三方UI,并且拦截到其ajax请求的返回结果.当结果为AVALIABLE的时候,停止刷新并语音提示,否则继续刷新. 分析这个需求,发现需要 ...

  4. 【Java 语言】Java 多线程 一 ( 线程启动 | 线程中断 )

    一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...

  5. C# 线程的暂停和恢复的 实现

    我们可以通过ManualResetEvent类来实现. 声明, 初始化时不执行 private static ManualResetEvent _eventWorkList = new ManualR ...

  6. Java多线程系列——线程池原理之 ThreadPoolExecutor

    ThreadPoolExecutor 简介 ThreadPoolExecutor 是线程池类. 通俗的讲,它是一个存放一定数量线程的线程集合.线程池允许多个线程同时运行,同时运行的线程数量就是这个线程 ...

  7. Java多线程之线程的启动

    Java多线程之线程的启动 一.前言 启动线程的方法有如下两种. 利用Thread 类的子类的实例启动线程 利用Runnable 接口的实现类的实例启动线程 最后再介绍下java.util.concu ...

  8. MFC 线程启动、暂停、继续、终止

    CWinThread* p_myThread;//创建线程指针 BOOL flag_myThread = FALSE;//是否终止 //头文件中声明(放类内) static UINT MyThread ...

  9. WinForm多线程学习文档

    基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...

随机推荐

  1. [每日一题] OCP1z0-047 :2013-08-24 FLASHBACK—TABLE/PRIMARY KEY(FOREIGN KEY?)......98

    正确答案:D 根据题意如下操作: 一.创建表dept gyj@OCM> CREATE TABLE DEPT 2 (DEPTNO NUMBER(2,0), 3 DNAME VARCHAR2(14) ...

  2. Java从零开始学三十(String和StringBuffer类)

    一.StringBuffer连接字符操作 当一个字符串的内容需要被经常改变时就要使用StringBuffer 在StringBuffer中使用append()方法,完成字符串的连接操作   二.Str ...

  3. cp 命令(转)

    原文:http://www.cnblogs.com/peida/archive/2012/10/29/2744185.html cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情 ...

  4. Java从零开始学十二(构造方法)

    一.构造方法 构造方法的主要目的是为类中的属性初始化 二.构造方法的定义格式 class 类名称{ 访问权限 类名称(类型1 参数1,类型2 参数2,…){ 程序语句 ; …    // 构造方法没有 ...

  5. Junit和Spring

    @ContextConfiguration 用来指定加载的Spring配置文件的位置,会加载默认配置文件 例如下例会加载:classpath:/com/example/MyTest-context.x ...

  6. 常见的前端UI框架

    Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气.自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者 ...

  7. oracle卸载清除注册表(彻底卸载)

    用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢? 那就是直接注册表清除,步骤如下: . 开始->设置->控制面板-& ...

  8. def函数之另类用法

    #python 27 #xiaodeng def list_opts(): return [ ('name', 'xiaodeng'), ('age', 28), ('), ('where', 'en ...

  9. MyEclipse下的Debug调试技巧汇总

    首先以debug模式启动tomcat,并文件中设断点,然后运行,当程序走到断点处就会转到debug视图下 [1]快捷键(F8)直接执行程序. [2]快捷键(F5)单步执行程序,遇到方法时进入. [3] ...

  10. 利用kaptcha生成验证码的详细教程

    kaptcha是一个简单好用的验证码生成工具,有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.Ka ...