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. Java类、对象以及(静态)方法的探讨

    大家好,这是我的第一篇博客.在这里我想跟大家分享一下Java最基础的Class and Object,也就是我们熟说的类和对象,以及对Java方法的探讨. 初学时的我因为没有对这里面的每一行代码思考透 ...

  2. eclipse配置JD-Eclipse反编译java的class文件 【2021年最新版使用教程】

    简介 就是像eclipse那样ctrl+左键点击查看源码,不过eclipse本身不带这种插件而已 0x00 下载JD-eclipse 官网:http://java-decompiler.github. ...

  3. Nginx01 简介和安装

    1 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler ...

  4. 基于昇腾计算语言AscendCL开发AI推理应用

    摘要:本文介绍了昇腾计算语言AscendCL的基本概念,并以示例代码的形式介绍了如何基于AscendCL开发AI推理应用,最后配以实际的操作演示说明如何编译运行应用. 本文分享自华为云社区<基于 ...

  5. WPF跨平台方案?

    Avalonia XPF 通过我们的跨平台UI框架,释放现有WPF应用程序的全部潜力,使WPF应用程序能够在macOS和Linux上运行,而不需要昂贵和有风险的重写. 工作原理 我们使用 Fork o ...

  6. 从 Newtonsoft.Json 迁移到 System.Text.Json

    一.写在前面 System.Text.Json 是 .NET Core 3 及以上版本内置的 Json 序列化组件,刚推出的时候经常看到踩各种坑的吐槽,现在经过几个版本的迭代优化,提升了易用性,修复了 ...

  7. 《价值流动-Project To Product》读后感

    背景:2022年8月,在这家公司已经任职满两年.这两年我最大的成就就是基于Scrum模式推行了敏捷项目管理,并取得了一定的成果.但是,在推行了两年后新的问题也产生了.例如: 1,项目管理上,项目经理缺 ...

  8. windows C++

    #include <Windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar ...

  9. Spring框架-IoC核心

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

  10. EPICS Archiver Appliance的定制部署1

    https://blog.csdn.net/weixin_43767046/article/details/112116112 简单部署试了一下之后,又试了下Site specific install ...