C# 多线程控制控件线程的创建、暂停、继续、停止
多线程
跨线程对控件操作需要使用委托来进行操作
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// 多线程
using System.Threading;
// 委托
using System.Runtime.InteropServices;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 方法一 跨线程更改控件(不推荐)
// 禁止捕获对错误线程的调用(不推荐)
//System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
// 方法二 跨线程更改控件(推荐)
// 创建委托:delegate
delegate void SetTextCallBack(string text);
// 内部在调用委托又调用自身: 自身-->委托(自身)
private void SetText(string text)
{
//如果 该程序段在一个非UI线程中执行 那么InvokeRequired就为真 执行if{}里面的内容
//如果 该程序段在UI线程中执行 那么InvokeRequired就为假 不执行if{}里面的内容
//完整的应该是这样的:
//if (InvokeRequired)
//{
// BeginInvoke(new OnPresenceDelegate(con_OnPresence), new object[] { sender, pres });
// return;
//}
//else
//{
// //直接操作 控件
//}
// 触发if-->调用自身-->触发else 达到线程外修改控件的目的
if (this.textBox1.InvokeRequired)
{
SetTextCallBack stcb = new SetTextCallBack(SetText);
this.Invoke(stcb, new object[] { text });
}
else
{
// 你要修改的控件代码
// ---------------------------------
this.textBox1.Text = text;
// ---------------------------------
}
}
// 创建内存空间 模拟事件 暂停或运行 线程
ManualResetEvent m;
// 创建内存空间 取消线程
CancellationTokenSource tokenSource;
// 创建线程按钮
private void button1_Click(object sender, EventArgs e)
{
// 取消线程令牌的工厂
tokenSource = new CancellationTokenSource();
// 取消线程令牌的创建
CancellationToken cancellationToken = tokenSource.Token;
// 模拟事件 创建
m = new ManualResetEvent(true);
// 创建多线程工程 开始运行
Task.Factory.StartNew(() =>
{
for (int k = 0; k < 100; k )
{
// 判断取消令牌是否生效
if (cancellationToken.IsCancellationRequested)
{
return;
}
// 暂停 或 继续
m.WaitOne();
// ------------------------在线程内做的事情
// 显示数字(修改控件)
SetText(k.ToString());
Thread.Sleep(500);
// ------------------------在线程内做的事情
}
},cancellationToken);
}
// 暂停线程按钮
private void button2_Click(object sender, EventArgs e)
{
m.Reset();
}
// 继续线程按钮
private void button3_Click(object sender, EventArgs e)
{
m.Set();
}
// 取消线程按钮
private void button4_Click(object sender, EventArgs e)
{
// 归零
textBox1.Text = "0";
// 立即取消线程
tokenSource.Cancel();
// 延时取消线程
//tokenSource.CancelAfter(3000);
// 如果使用延时取消, 归零无效
//textBox1.Text = "0";
}
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgheiga
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13