task 子线程添加数据到主线程 winfrom
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 导出dbf文件
{
public partial class Form1 : Form
{
#region 公共变量
static CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
ManualResetEvent resetEvent = new ManualResetEvent(true);
List<Task> listTask = new List<Task>();
#endregion
public Form1()
{
InitializeComponent();
pro_Task.Visible = false;
}
/// <summary>
/// 开始导入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Btn_imp_Click(object sender, EventArgs e)
{
#region 检查是否有任务 保证一次只执行一个任务
if (listTask.Count > 0)
{
if (listTask.Where(x => x.IsCompleted == false).Count() > 0)
{
MessageBox.Show($"请完成当前任务,或者取消当前任务");
return;
}
}
pro_Task.Value = 0;
pro_Task.Visible = true;
pro_Task.Maximum = 999;
#endregion
#region 立即执行
listTask.Add(Task.Run(() =>
{ for (int i = 0; i < 1000; i++)
{
if (!cts.IsCancellationRequested)
{
resetEvent.WaitOne();
pro_Task.Invoke(new Action(() => { pro_Task.Value = i; }));
textBox1.Invoke(new Action(() =>
{
textBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "_" + i + System.Environment.NewLine);
}));
}
else
{
return;
}
}
}, ct)
.ContinueWith(x =>
{
if (x.IsCanceled || x.IsFaulted || cts.IsCancellationRequested)
{
MessageBox.Show($"任务被取消");
}
else
{
MessageBox.Show($"任务已完成");
}
cts = new CancellationTokenSource();
ct = cts.Token;
listTask.Clear();
pro_Task.Invoke(new Action(() => { pro_Task.Visible = false; }));
}));
#endregion
#region 延迟执行
//listTask.Add(new Task(() =>
//{
// for (int i = 0; i < 10000; i++)
// {
// if (!cts.IsCancellationRequested)
// {
// textBox1.Invoke(new Action(() => textBox1.AppendText($"循环已执行到{i}{Environment.NewLine}")));
// }
// else
// {
// return;
// }
// }
//}, ct));
//listTask[0].Start();
//listTask[0].ContinueWith(x => {
// if (x.IsCanceled || x.IsFaulted|| cts.IsCancellationRequested)
// {
// MessageBox.Show($"任务被取消");
// }
// else
// {
// MessageBox.Show($"任务已完成");
// }
// cts = new CancellationTokenSource();
// ct = cts.Token;
// listTask.Clear();
//});
#endregion
}
/// <summary>
/// 取消导入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Btn_ImpCancel_Click(object sender, EventArgs e)
{
ChecklistTask(listTask.Count, null, resetEvent.Set);
ChecklistTask(listTask.Count, cts.Cancel);
}
/// <summary>
/// 线程停止
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Btn_ImpStop_Click(object sender, EventArgs e)
{
ChecklistTask(listTask.Count,null,resetEvent.Reset);
}
/// <summary>
/// 线程继续
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Btn_ImpCon_Click(object sender, EventArgs e)
{
ChecklistTask(listTask.Count, null,resetEvent.Set);
}
/// <summary>
/// 检查是否有任务并执行方法
/// </summary>
/// <param name="listTask"></param>
/// <param name="action"></param>
public void ChecklistTask(int listTask, Action action =null, Func<bool> Func=null)
{
if (listTask > 0)
{
if (action != null)
{
action();
}
else if (Func != null)
{
Func();
}
else
{ }
}
} }
}
task 子线程添加数据到主线程 winfrom的更多相关文章
- mybatis+oracle添加一条数据并返回所添加数据的主键问题
最近做mybatis+oracle项目的时候解决添加一条数据并返回所添加数据的主键问题 controller层 @RequestMapping("/addplan") public ...
- oracle添加数据时主键自动增长
CREATE TABLE STUDENT( --创建学生表 ID NUMBER(10) PRIMARY KEY, --主键ID SNAME VARCHAR2(20), ); 此时给学生表添加数 ...
- pthread_getspecific()--读线程私有数据|pthread_setspecific()--写线程私有数据
原型: #include <pthread.h> void *pthread_getspecific(pthread_key_t key); int pthread_setspecific ...
- 多线程异步操作导致异步线程获取不到主线程的request信息
org.springframework.web.context.request.RequestContextHolderorg.springframework.web.context.request. ...
- mybatis添加数据返回主键
程序结构图: 表结构: 创表sql: Create Table CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `us ...
- UNIX环境高级编程——线程私有数据
线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变 ...
- C# 多线程join的用法,等待多个子线程结束后再执行主线程
等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ...
- C#用副线程改主线程(UI线程)的控件属性的方法(包括Winform和WPF)
C#用副线程去试图修改主线程的UI控件会报出异常,解决方案是使用副线程注册事件通知主线程自己去修改UI控件 在winform中,方法如下 private void button1_Click(obje ...
- [转] unix/linux下线程私有数据实现原理及使用方法
在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程 ID不能保证是一个小而连续的整数,并且用数组实现的时候 ...
- pthread线程特定数据
举个栗子 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/t ...
随机推荐
- [WPF]auto和*总结
Auto和*效果 Auto 表示自动适应显示内容的宽度, 控件有多大,就显示多大. * 则表示按比例来分配宽度. 话不多说,直接上例子理解 例子1 代码: <Grid ShowGridLines ...
- 關於scanf()的使用
要使用scanf函數進行輸入: 1.如果用scanf()要輸入讀取基本變量的值,需要加&. 2.如果用scanf()讀取的是把字符串讀入字符數組中,則不需要加& 1 #include& ...
- strapi系列-如何去除接口里的attributes以及 data key,配置关联数据等
我们先来创建一个接口,然后看一下正常接口返回的数据格式是什么样子 创建表以及字段 添加一条数据 配置接口权限 我暂时给了这个接口PUBLIC权限,用来测试 使用postman进行接口测试 我们可以看到 ...
- 静态文件相关配置、request请求方法、pycharm连接MySQL、orm
静态文件相关配置.request请求方法.pycharm连接MySQL.orm 风得意马蹄疾,一日看尽长安花 一.静态文件相关配置 1.编写一个登录功能 1.创建一个django项目并创建一个app ...
- P6327 区间加区间sin和 题解
P6327 区间加区间sin和 题解 题目描述 给出一个长度为 \(n\) 的整数序列 \(a_1,a_2,\ldots,a_n\),进行 \(m\) 次操作,操作分为两类. 操作 \(1\):给出 ...
- 异常处理的第二种方式-Throwable类中3个异常处理的方式
异常处理的第二种方式 如果异常出现的话,会立刻终止程序,所以我们得处理异常: 1.该方法不处理,而是声明抛出,由该方法的调用者来处理(throws). 2.在方法中使用try-catch的语句块来处理 ...
- Quartz.Net 官方教程 Tutorial 1/3(Jobs 和 Trigger)
根据官网说明 类型 概述 IScheduler 调度类核心接口 IJob 独立实现业务逻辑需要继承的任务接口 IJobDetail 给任务接口定义实例的任务说明类接口 ITrigger 触发器,设置何 ...
- 【rust】rsut基础:模块的使用一、mod 关键字、mod.rs 文件的含义等
本文内容 这篇文章是实战性质的,也就是说原理部分较少,属于经验总结,rust对于模块的例子太少了.rust特性比较多(悲),本文的内容可能只是一部分,实现方式也不一定是这一种. 关于 rust 模块的 ...
- 力扣---213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房 ...
- 使用HtmlAgilityPack 爬取 国家统计局 区划和城乡划分代码
HtmlAgilityPack:Html解析神器,根据url地址解析html页面内容. 项目引用HtmlAgilityPack.dll文件或者通过安装 nuget 包 HtmlAgilityPack ...