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. 05-Sed操作参数(II)

    1 Sed操作参数 1.1 q 参数q表示跳离sed [address1]q sed执行跳离动作的时候,会停止输入pattern space数据,同时停止数据送到标准输出文件. 例1 对于文件执行sc ...

  2. Flutter新版本2.X系列--01创建项目

    1.新建项目,打开Android studio,点击红圈部分 2.选择第一个 3.设置你的项目名称,flutter sdk位置,以及项目存储路径 4.设置包名,这个要唯一 5.好啦 ~ 作为一名前端开 ...

  3. java入门与进阶 P-2.7+P-3.1

    判断语句常见错误 忘了大括号 永远在if和else后面加上大括号,即使当时后面只有一条语句 if后面的分号 错误使用== 和= if只要求()里面的值是零或者非零 = 是赋值 == 是判断是否相同 代 ...

  4. mysql19-锁

    1.什么是锁 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性. ...

  5. EF Core DBFirst和CodeFirst 模式使用方法

    一.安装依赖包 1.Microsoft.EntityFrameworkCore 2.Microsoft.EntityFrameworkCore.Tools 3.Microsoft.EntityFram ...

  6. rosdep update 一直失败问题

    1.排除网络问题 2.增加TIMEOUT的时间: 更改 /usr/lib/python2.7/dist-packages/rosdep2/下的三个文件sources_list.py.gbpdistro ...

  7. uboot目录

    目录 api 与硬件无关的 API 函数. arch 与架构体系有关的代码. 各种架构,例如arm cpu  各种版本的cpu, 例如armv7, arm9 各种厂商,例如瑞芯微mach-rockch ...

  8. LG P4173 残缺的字符串

    \(\text{Problem}\) 大概就是带通配符的字符串匹配问题,输出所有比配位置 \(1\le n \le 3\times 10^5\) \(\text{Solution}\) 这是 \(FF ...

  9. JZOJ 4289.Mancity

    \(Mancity\) \(Description\) \(Input\) \(Output\) \(Sample Input\) 8 3 6 1 2 1 1 3 2 4 2 5 1 6 1 6 2 ...

  10. JZOJ 5451.Genocide

    题目 题解 对于 \(m=1\) 这档分 我们可以 \(dp\) 然后斜率优化 具体来说就是 \(f_i = f_j + \frac{(i-j)\times (i-j+1)}{2} + sum[j]- ...