using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms; namespace 线程和跨线程
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 单线程直接假死了
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAlone_Click(object sender, EventArgs e)
{
for (int i = ; i < ; i++)
{
//通过[调试]-[窗口]-[输出]显示打印值
Console.WriteLine(i);
}
} /// <summary>
/// 新线程运行,窗体不假死
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnNew_Click(object sender, EventArgs e)
{
Thread th = new Thread(ShowCalculator)
{
IsBackground = true
};
th.Start(); }
/// <summary>
/// 循环计算方法,供新线程使用
/// </summary>
private void ShowCalculator()
{
for (int i = ; i < ; i++)
{//通过[调试]-[窗口]-[输出]显示打印值
Console.WriteLine(i);
}
}
/// <summary>
/// 带参数的
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnParameters_Click(object sender, EventArgs e)
{
List<int> list = new List<int>() { , , , , };
ParameterizedThreadStart parThreadStart = new ParameterizedThreadStart(ShowParameters);
Thread th = new Thread(parThreadStart) { IsBackground = true };
th.Start(list);
}
private void ShowParameters(object obj)
{
//线程中的参数只能是Object
List<int> result = obj as List<int>;
foreach (var item in result)
{
MessageBox.Show(item.ToString());
}
}
/// <summary>
/// 跨线程访问
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(ShowMulti) { IsBackground = true };
th.Start();
}
/// <summary>
/// 解决跨线程访问报异常,不使用关闭跨线程检查
/// </summary>
private void ShowMulti()
{
int first = ;
for (int i = ; i < ; i++)
{
first = i;
}
//是否要对lbl控件进行跨线程
if (this.lblShow.InvokeRequired)
{
//对委托中的数据类型验证
this.lblShow.Invoke(new Action<Label, string>(ShowLableValue), this.lblShow, first.ToString());
}
else
{
this.lblShow.Text = first.ToString();
}
}
/// <summary>
/// 把值写到控件中
/// </summary>
/// <param name="lbl"></param>
/// <param name="value"></param>
private void ShowLableValue(Label lbl, string value)
{
lbl.Text = value;
} private void Form1_Load(object sender, EventArgs e)
{
//关闭跨进程检查
//Label.CheckForIllegalCrossThreadCalls = false;
//改用委托方法实现
}
}
}

c#基础,单线程,跨线程访问和线程带参数的更多相关文章

  1. ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成

    ASP.NET Boilerplate 学习   1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...

  2. C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它

    C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件“Form1”的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; ...

  3. 如何跨线程访问Winform中的UI元素

    如何跨线程访问Winform中的UI元素 假如制作一个Socket聊天应用程序,很可能会用到多线程: 例如为Receive方法开辟单独一个线程,例如为Receive方法开辟单独一个线程(后台运行的线程 ...

  4. C# WinForm 跨线程访问控件

    问题出现: 在WinForm 处理多线程访问主线程的控件时候,就会出现如图所示的错误对话框:    解决方案:  方案一:去掉线程访问主线程UI控件的安全检查,使用: Control.CheckFor ...

  5. 2019-10-12-win10-uwp-非ui线程访问-ui-

    title author date CreateTime categories win10 uwp 非ui线程访问 ui lindexi 2019-10-12 15:0:12 +0800 2018-2 ...

  6. 线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9041318.html 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运 ...

  7. python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)

    昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...

  8. python全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python理论知识,线程的创建)

    昨日内容回顾 队列 队列:先进先出.数据进程安全 队列实现方式:管道+锁 生产者消费者模型:解决数据供需不平衡 管道 双向通信,数据进程不安全 EOFError: 管道是由操作系统进行引用计数的 必须 ...

  9. 跨线程访问UI控件时的Lambda表达式

    工作中经常会用到跨线程访问UI控件的情况,由于.net本身机制,是不允许在非UI线程访问UI控件的,实际上跨线程访问UI控件还是 将访问UI的操作交给UI线程来处理的, 利用Control.Invok ...

随机推荐

  1. Could not load file or assembly 'System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

    提示哪个引用修改哪个引用的属性: Could not load file or assembly 'System.Web.Http, Version=4.0.0.0, Culture=neutral, ...

  2. git如何避免push/pull时输入密码

    今天在搭建git服务器的时候,一切顺利,但是就是在git push的时候老是要输入密码,太烦了,然后百度搜索了一下,总结了主要有如下三种方法: 方法1 git config --global cred ...

  3. mybatis的基本语句的应用

    大家好今晚整理有关mybatis的添加删除修改更新的操作 一.select <!-- 查询学生,根据id --> <select id="getStudent" ...

  4. python基础之函数式编程

    一.定义: 函数作为参数作用:将核心逻辑传入方法体,使该方法的适用性更广,体现了面向对象的开闭原则: 函数作为返回值作用:逻辑连续,当内部函数被调用时,不脱离当前的逻辑. 二.高阶函数: 1.定义:将 ...

  5. [Swift]LeetCode347. 前K个高频元素 | Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

  6. [Swift]LeetCode456. 132模式 | 132 Pattern

    Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that  ...

  7. [Swift]LeetCode676. 实现一个魔法字典 | Implement Magic Dictionary

    Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...

  8. Linux(Ubuntu) OpenGL 开发环境

    Linux(Ubuntu) OpenGL 开发环境 在 PC 平台上开发 OpenGL 可以使用的辅助工具有很多选择,这里我主要参考了 learnopengl 的配置,使用 GLFW 和 GLAD. ...

  9. spark按某几列删除dataframe重复行

    新建一个 dataframe : val conf = new SparkConf().setAppName("TTyb").setMaster("local" ...

  10. python获取当前运行程序的名字

    import os filename = os.path.abspath(__file__) print filename 打印结果: E:\bluedon\test.py