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 ...
随机推荐
- Linux 驱动之内核定时器
1.定时器 之前说过两类跟时间相关的内核结构. 1.延时:通过忙等待或者睡眠机制实现延时. 2.tasklet和工作队列,通过某种机制使工作推后运行,但不知道运行的详细时间. 接下来要介绍的定时器,可 ...
- Python 的时间格式化
对于像'Wed, 11 Apr 2012 09:37:05 +0800'的时间格式化可如下解: >>> date='Wed, 11 Apr 2012 09:37:05 +0800'& ...
- Linux必看书籍
<鸟哥的Linux私房菜:基础学习篇(第三版)> <鸟哥的Linux私房菜——服务器架设篇> <高性能Linux服务器构建实战> <实战Nginx:取代 Ap ...
- 优化后队列的实现(C语言实现)
上一篇中的队列的定义与实现(C语言实现) 中.不管是顺序队列还是链式队列,在尾加和删除头部的操作时.总有一个时间复杂度让人不惬意. 比方在顺序队列中,删除头部的操作后,总要将后面全部的结点都向前移动一 ...
- oracle 批量更新之将一个表的数据批量更新至另一个表
oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...
- Android 沉浸式状态栏的三种实现方式
沉浸式状态栏 Google从android kitkat(Android 4.4)開始,给我们开发人员提供了一套能透明的系统ui样式给状态栏和导航栏,这种话就不用向曾经那样每天面对着黑乎乎的上下两条黑 ...
- JDBC实战案例--利用jdbc实现的宠物信息管理系统
一.需求: 利用jdbc实现对宠物的信息进行管理的一套系统 宠物信息:宠物ID,宠物类别,宠物名字,宠物性别,宠物年龄,宠物入库日期 系统完成功能:实现对宠物信息的录入,修改,删除,查询. 二.解决方 ...
- Linux对包管理阐述
Centos/Redhat/Fedora的软件包,都是rpm后缀的文件.包管理器rpm(Redhat packages manager) linux的哲学思想是简单命令解决复杂任务,因此每个软件的功 ...
- iOS- 快速实现展示布局
概述 比较有规律的页面, 快速实现展示布局, 提高开发效率. 详细 代码下载:http://www.demodashi.com/demo/10713.html 看到这个界面,是不是觉得不像那种比较有规 ...
- MyEcplise安装Freemarker插件(支持.ftl文件)
1.下载插件:http://sourceforge.net/projects/freemarker-ide/?source=typ_redirect 2.下载freemarker-2.3.19.jar ...