/// <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. Speculative Execution in Hadoop

    来自:http://blog.csdn.net/macyang/article/details/7880671 所谓的推测执行,就是当所有task都开始运行之后,Job Tracker会统计所有任务的 ...

  2. 算法笔记_125:算法集训之编程大题集一(Java)

     目录 1 砝码称重 2 公式解析 3 购物券消费方案 4 机器人行走 5 角谷步数 6 矩形区域的交和并 7 矩阵变换加密法 8 控制台表格 9 拉丁方块填数字 10 立方和等式   1 砝码称重 ...

  3. 虚拟机安装的Winserver 2008 R2系统,宿主机无法ping通主机

    新安装的虚拟机,在虚拟机中安装了Winserver2008 R2系统,网络适配器已经设置为桥接模式(自动) 刚开始的几天很正常,但是过了几天后,发现连接不了了,后来才发现是因为网络问题. 解决方案:修 ...

  4. Java多线程系列目录(共43篇)(转)

    Java多线程系列目录(共43篇) http://www.cnblogs.com/skywang12345/p/java_threads_category.html

  5. java 内省(Introspector)

    开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性. 当然你也可以用反射来操作JavaB ...

  6. WordPress 主题教程:从零开始制作 WordPress 主题

    为什么要开发WordPress主题? WordPress主题由一系列文件和样式表单组成,这些文件和样式表单共同作用生成WordPress网站的外观.每个主题都不同,用户可以通过这些主题随心所欲地更换自 ...

  7. 最快下载速度100Mbps!4G LTE技术全解析

    1导读,关于4G的几个关键概念 [PConline资讯]100Mbps下载速度是什么概念?比3G网速快50倍又是什么概念?比3G通信方式更灵活.通信频谱更宽绰.通信质量更高效.通信费用更便宜是怎样一个 ...

  8. C#:定义窗口快捷键

    事情的关键是要设置Form的KeyPreview属性,然后再在KeyDown事件中检查按键. public class TEST : Form { public TEST() { Initialize ...

  9. 【TP3.2】:日志记录和查看

    1.TP3.2手册日志类链接:http://document.thinkphp.cn/manual_3_2.html#log 2.日志默认路径:/Application/Runtime/Logs 3. ...

  10. TP3.2设置URL伪静态满足更好的SEO效果

    URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行. ...