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();
//初始化进度条最大值
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 多线程异步操作线程启动暂停与恢复的更多相关文章
- Java多线程之线程的暂停
Java多线程之线程的暂停 下面该稍微休息一下了呢……不过,这里说的是线程休息,不是我们哦.本节将介绍一下让线程暂停运行的方法. 线程Thread 类中的sleep 方法能够暂停线程运行,Sleep ...
- 利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复(转)
利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复 打印过程可能很长,这时候有可能需要暂停下来做一些事情,然后回来继续接着打印 打印过程中有2个线程:一个是程序运行的主线程, ...
- ManualResetEvent实现线程的暂停与恢复
背景 前些天遇到一个需求,在没有第三方源码的情况下,刷新一个第三方UI,并且拦截到其ajax请求的返回结果.当结果为AVALIABLE的时候,停止刷新并语音提示,否则继续刷新. 分析这个需求,发现需要 ...
- 【Java 语言】Java 多线程 一 ( 线程启动 | 线程中断 )
一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...
- C# 线程的暂停和恢复的 实现
我们可以通过ManualResetEvent类来实现. 声明, 初始化时不执行 private static ManualResetEvent _eventWorkList = new ManualR ...
- Java多线程系列——线程池原理之 ThreadPoolExecutor
ThreadPoolExecutor 简介 ThreadPoolExecutor 是线程池类. 通俗的讲,它是一个存放一定数量线程的线程集合.线程池允许多个线程同时运行,同时运行的线程数量就是这个线程 ...
- Java多线程之线程的启动
Java多线程之线程的启动 一.前言 启动线程的方法有如下两种. 利用Thread 类的子类的实例启动线程 利用Runnable 接口的实现类的实例启动线程 最后再介绍下java.util.concu ...
- MFC 线程启动、暂停、继续、终止
CWinThread* p_myThread;//创建线程指针 BOOL flag_myThread = FALSE;//是否终止 //头文件中声明(放类内) static UINT MyThread ...
- WinForm多线程学习文档
基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...
随机推荐
- 在MyEclipse中设置jsp页面为默认utf-8编码(转)
http://www.cnblogs.com/xdp-gacl/p/3496161.html 在MyEclispe中创建Jsp页面,Jsp页面的默认编码是“ISO-8859-1”,如下图所示: 在这种 ...
- EL运算符(web基础学习笔记十七)
一.EL语法 1.1.语法结构 ${expression} 1.2.[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一 ...
- Linux 下搭建流媒体服务器
http://blog.csdn.net/huangtaishuai/article/details/9836581 ----------------------------------------- ...
- Gradle修改Maven仓库地址
博客已经搬家https://www.tianmingxing.com 背景 不知从什么时候大家开始使用gradle管理项目了,随着时间的推移从maven转过来的人肯定越来越多.关于gradle的优势在 ...
- gradle 项目转成maven项目
找到一个个子项目目录下的build.gradle文件,在文件开头添加以下内容: apply plugin: 'java' apply plugin: 'maven' compileJava.optio ...
- ORACLE NVL 和 NVL2 函数的使用
NVL函数是一个空值转换函数,在SQL查询中主要用来处理null值.在不支持 null 值或 null 值无关紧要的情况下,可以使用 NVL( ) 来移去计算或操作中的 null 值. Oracle在 ...
- c++中的友元函数
1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具 ...
- vue diff算法 patch
1.diff比较算法 图示: diff比较只会在同层级进行, 不会跨层级比较. 所以diff是:广度优先算法. 时间复杂度:O(n) 代码示例: <!-- 之前 --> <div&g ...
- Hibernate日期映射类型
映 射 类 型 Java类型 标准SQL类型 描 述 date java.util.Date或者java.sql.Date DATE 代表日期,形式为: YYYY-MM-DD time java ...
- Java编程思想(十五) —— 类型信息之反射
讲完.class,Class之后,继续. 1)泛化的Class引用 Class也能够增加泛型,增加之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,尽管他们是等价的,C ...