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的更多相关文章

  1. mybatis+oracle添加一条数据并返回所添加数据的主键问题

    最近做mybatis+oracle项目的时候解决添加一条数据并返回所添加数据的主键问题 controller层 @RequestMapping("/addplan") public ...

  2. oracle添加数据时主键自动增长

    CREATE TABLE STUDENT( --创建学生表  ID NUMBER(10) PRIMARY KEY,   --主键ID  SNAME VARCHAR2(20), ); 此时给学生表添加数 ...

  3. pthread_getspecific()--读线程私有数据|pthread_setspecific()--写线程私有数据

    原型: #include <pthread.h> void *pthread_getspecific(pthread_key_t key); int pthread_setspecific ...

  4. 多线程异步操作导致异步线程获取不到主线程的request信息

    org.springframework.web.context.request.RequestContextHolderorg.springframework.web.context.request. ...

  5. mybatis添加数据返回主键

    程序结构图: 表结构: 创表sql: Create Table CREATE TABLE `users` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `us ...

  6. UNIX环境高级编程——线程私有数据

    线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变 ...

  7. C# 多线程join的用法,等待多个子线程结束后再执行主线程

    等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ...

  8. C#用副线程改主线程(UI线程)的控件属性的方法(包括Winform和WPF)

    C#用副线程去试图修改主线程的UI控件会报出异常,解决方案是使用副线程注册事件通知主线程自己去修改UI控件 在winform中,方法如下 private void button1_Click(obje ...

  9. [转] unix/linux下线程私有数据实现原理及使用方法

     在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程 ID不能保证是一个小而连续的整数,并且用数组实现的时候 ...

  10. pthread线程特定数据

    举个栗子 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/t ...

随机推荐

  1. do while 出口條件循環

  2. forEach(遍历) VS map(映射) VS reduce(聚合)---学习笔记

  3. ATM+购物车功能

    ATM+购物车功能 一.项目需求 1.额度15000或自定义 --> 注册功能 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 --> 购物功能.支付功能 3.可以提现,手续费5% ...

  4. VM安装Centos 经典安装

    1 VM安装配置 1.1 新建虚拟机 1.2 选择典型 1.3 选择CentOS镜像 链接:https://pan.baidu.com/s/1K2rTjrWY5sgEgx2pU0x-gg 提取码:89 ...

  5. .NET为什么推荐它作为RabbitMQ消息队列的首选开发工具

    支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac. RabbitMQ作为一款主流的消息队列工具早已 ...

  6. Opengl ES之踩坑记

    前因 最近在尝试使用Opengl ES实现一些LUT滤镜效果,在实现这些滤镜效果的时候遇到一些兼容性的坑,踩过这些坑后我希望把这几个坑分享给读者朋友们, 希望同在学习Opengl ES的朋友们能少走弯 ...

  7. Ubuntu/linux下最强大的下载工具-aria2

    aria2 是 Linux 下一个不错的高速下载工具 .由于它具有分段下载引擎,所以支持从多个地址或者从一个地址的多个连接来下载同一个文件.这样自然就大大加快了文件的下载速 度.aria2 也具有断点 ...

  8. Spring(认识、IOC的开发过程、创建bean的方式)

    spring框架(spring全家桶) spring FrameWork springBoot+springCloud+springCloud Data Flow 一:spring的两大核心机制: I ...

  9. 使用idea的maven项目使用mybatis时遇到的坑

    在使用idea的maven项目中使用mybatis时遇到的一个问题,这个问题困扰了我一段时间,所以我来这里记录一下! 出现的问题是: 我把相同的代码复制到eclipse中,在eclipse中却能正常运 ...

  10. Me-and-My-Girlfriend-1

    Me-and-My-Girlfriend-1 目录 Me-and-My-Girlfriend-1 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.2.1 目录分析 2 GetShell 2. ...