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 ...
随机推荐
- 高性能 Java 框架。Solon v1.12.3 发布(春节前兮的最后更)
一个更现代感的 Java "生态型"应用开发框架:更快.更小.更自由.不是 Spring,没有 Servlet,也无关 JavaEE:新兴独立的轻量生态 (已有150来个生态插件) ...
- sstream中的stringstream怎么用
sstream中的stringstream怎么用 1.cin cin是从缓冲区读入,会把空格.回车等不可见的字符当做是分割,跳过.并且最后读入之后,后面会有剩余的部分,比如空格.回车等. 2.getl ...
- 图文并茂的学习笔记--微信小程序自定义tabbar
我发现自带的那个tabbar不可以修改样式,没得搞啊,这不行,要改 首先,我们看文档,地址在下面 https://developers.weixin.qq.com/miniprogram/dev/fr ...
- java进阶P-2.7
类函数 函数 用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回:对某些特殊字符,如果字符(串)正好是正则的一部分,则需要转义才能使用 字符有 | , + , * , ^ , $ , ...
- 软工综合实践课设——员工招聘系统(参考BOSS直聘);Pyhton实现
应用背景: 随着科学技术的发展,岗位数量越来越多,特别是每逢毕业季找工作的人数也很多,如果人们找工作或者企业招人靠纯手工的话,费时费力,仅仅是筛选简历和费劲,并且员工找工作投简历可能得需要克服时间和空 ...
- Redis02 在linux安装部署(单机版)
1 安装gcc编译器 进入linux,执行命令 sudo apt-get install -y gcc Centos使用yum命令替代apt-get sudo yum install -y gcc 2 ...
- spring源码写注释
转:https://blog.csdn.net/z_c8819/article/details/105258015 1.从GitHub上下载spring项目 https://github.com/sp ...
- P24_wxss - wxss与css的关系
WXSS 模板样式 什么是 WXSS WXSS (WeiXin Style Sheets)是一套样式语言,用于美化 WXML 的组件样式,类似于网页开发中的 CSS. WXSS 和 CSS 的关系 W ...
- Spring事务(Transaction)管理高级篇一栈式解决开发中遇到的事务问题
Spring是目前Java开发中最流行的框架了,它的事务管理我们在开发中常常的用到,但是很多人不理解它事务的原理,导致开发中遇到事务方面的问题往往都要用很长的时间才能解决,下面就带着大家去深入了解Sp ...
- CF1358D The Best Vacation
题目传送门 思路 做这道题主要是需要发现一个性质:选择的区间必定是从某一个月的最后一天开始往前连续的一段区间. 考虑如何证明这个结论,设这个月有 \(x\) 天,假设有更优的方案满足到下一个月的第 \ ...