1. 首先声明一个委托。

    delegate void SetTextCallback(string text);

  2. 然后再写一个事件。

    private void SetInfo(string text)

    {

    /// 这个事件是委托执行,在线程中无法直接控制窗体控件属性

    /// 用于在线程中在listBox_info控件中添加执行信息

    if (this.listBox_info.InvokeRequired)

    {

    SetTextCallback d = new SetTextCallback(SetInfo);

    this.Invoke(d, new object[] { text });

    }

    else

    {

    this.listBox_info.Items.Add(text);

    listBox_info.SelectedIndex = listBox_info.Items.Count - 1;

    }

    }

  3. 3

    在线程中使用时,只需调用这个方法即可。

     
    如此使用的原因是:
    操作系统有一个线程,循环获取最新窗体事件,然后触发窗体事件函数, 修改窗体控件属性, 为了避免其他线程同时修改控件属性带来的冲突,当某个方法修改控件属性时,要判断该方法和系统事件是否为同意线程, 如果不是,则通过Invoke函数,将修改方法封装成一个事件,放到消息队列中。
     
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     private void button1_Click(object sender, EventArgs e)
    {
    Console.WriteLine("111 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + " " + DateTime.Now.ToLongTimeString());
    AsyncMethod();//这个方法就是异步方法,异步方法的调用与一般方法完全一样
    Console.WriteLine("222 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + " " + DateTime.Now.ToLongTimeString());
    Thread.Sleep(10 * 1000);
    Console.WriteLine("333 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + " " + DateTime.Now.ToLongTimeString());
    } private async Task AsyncMethod()
    {
    var ResultFromTimeConsumingMethod = TimeConsumingMethod();
    string Result = await ResultFromTimeConsumingMethod;
    Result += " + AsyncMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + " " + DateTime.Now.ToLongTimeString();
    Console.WriteLine(Result);
    } private Task<string> TimeConsumingMethod()
    {
    var task = Task.Run(() => {
    Console.WriteLine("Helo I am TimeConsumingMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + " " + DateTime.Now.ToLongTimeString());
    Thread.Sleep(5000);
    Console.WriteLine("Helo I am TimeConsumingMethod after Sleep(5000). My Thread ID is :" + Thread.CurrentThread.ManagedThreadId + " " + DateTime.Now.ToLongTimeString());
    return "Hello I am TimeConsumingMethod";
    });
    return task;
    }

    以上代码在Winfrm执行结果为:

    在控制台执行结果为:

     

WinFrm中多线程操作窗体属性的更多相关文章

  1. iOS中多线程知识总结(一)

    这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下. 1.基本概念 1)什么是进程?进程的特性是什么? 进程是指在系统中正在运行的一个应用程序.   ...

  2. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  3. [转] c#中 多线程访问winform控件

    原文 c#中多线程访问winform控件的若干问题小结 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的 ...

  4. iOS 中多线程的简单使用

    iOS中常用的多线程操作有( NSThread, NSOperation GCD ) 为了能更直观的展现多线程操作在SB中做如下的界面布局: 当点击下载的时候从网络上下载图片: - (void)loa ...

  5. Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式

    Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...

  6. java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)

    在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...

  7. [delphi]在DLL中多线程同步Synchronize卡死问题

    在dll中多线程同步调用Synchronize不可以,会出现假死卡住的现象.可通过Sendmessage实现. 转网上其他文章解释: Application.Initialize; begin     ...

  8. C#中多线程的并行处理

    System.Threading.Tasks,在该命名空间下Task是主类,表示一个类的异步的并发的操作,创建并行代码的时候不一定要直接使用Task类,在某些情况下可以直接使用Parallel静态类( ...

  9. qt中多线程用法总结

    1.多线程的理解 在操作系统中线程和进程划分. 操作系统可以同时执行多个任务,每个任务就是进程:进程可以同时执行多个任务,每个任务就是线程. 线程之间相互独立,抢占式执行.对于单核CPU来说同一时刻只 ...

随机推荐

  1. Python+selenium之键盘和鼠标事件

  2. THUSC2021 游记

    Day -6 - 2459343 请了一天假在家卷 whk,u1s1 星期六为啥要去上学呢(bushi 中午 12:00 左右得知自己有去参加 THUSC 的资格 然后就是一堆待填写的资料和报名表 发 ...

  3. Jvarkit : Java utilities for Bioinformatics

    Jvarkit : Java utilities for Bioinformatics :一个java写的生物信息工具包:http://lindenb.github.io/jvarkit/

  4. linux 两服务器之间的文件传输scp

    Linux scp 命令用于 Linux 之间复制文件和目录. scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令. scp 是加 ...

  5. mysql—Linux系统直接进入mysql服务器,并实现一些基础操作

    首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql进程列表 如果mysql未启动,你可以使用以下命令 ...

  6. Linux 中的五种 IO 模型

    Linux 中的五种 IO 模型 在正式开始讲Linux IO模型前,比如:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一 ...

  7. ICCV2021 | TOOD:任务对齐的单阶段目标检测

    ​前言  单阶段目标检测通常通过优化目标分类和定位两个子任务来实现,使用具有两个平行分支的头部,这可能会导致两个任务之间的预测出现一定程度的空间错位.本文提出了一种任务对齐的一阶段目标检测(TOOD) ...

  8. 15. Linux提取RPM包文件(cpio命令)详解

    在讲解如何从 RPM 包中提取文件之前,先来系统学习一下 cpio 命令.cpio 命令用于从归档包中存入和读取文件,换句话说,cpio 命令可以从归档包中提取文件(或目录),也可以将文件(或目录)复 ...

  9. Linux 【复习巩固】

    目录 一.网络和服务 1.查看ip 2.查看主机名 配置 3.临时服务 1)基本语法(CentOS 6) 2)基本语法(CentOS 7) 3)示例 4.开机自启动服务 1)基本语法(CentOS 6 ...

  10. Vue面试专题(未完)

    1.谈一下你对MVVM原理的理解 传统的 MVC 指的是,用户操作会请求服务端路由,路由会调用对应的控制器来处理,控制器会获取数 据.将结果返回给前端,页面重新渲染.   MVVM :传统的前端会将数 ...