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. round函数和获取当前时间函数

    round函数:对一个浮点类型的数据进行四舍五入:round(3.14)   运行结果就是3 获取当前时间: time.time()    ,time函数需要导入才能使用,import time  

  2. 【R】一对一变为一对多:将列折叠/连接/聚合为每个组(一行)内的字符串?

    目录 需求 实现 方法一 其他方法 data.table dplyr aggregate sqldf 延申:不用逗号分隔 需求 原始文件: data <- data.frame(A = c(re ...

  3. jquery操作html中图片宽高自适应

    在网站制作中如果后台上传的图片不做宽高限制,在前台显示的时候,经常会出现图片变形,实用下面方法可以让图片根据宽高自适应,不论是长图片或者高图片都可以完美显示. $("#myTab0_Cont ...

  4. 1.TwoSum-Leetcode

    #include<iostream> #include<algorithm> #include<map> using namespace std; class So ...

  5. 『与善仁』Appium基础 — 16、APPium基础操作API

    目录 1.前置代码 2.安装和卸载APP 3.判断APP是否已安装 4.关闭APP软件和关闭驱动对象 5.发送文件到手机和获取手机中的文件 6.获取当前屏幕内元素结构(重点) 7.脚本内启动其他APP ...

  6. Demo01无重复数字

    package 习题集2;//有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?public class Demo1 { public static void main(S ...

  7. C#时间选择

    <script type="text/javascript" src="http://www.shicishu.com/down/WdatePicker.js&qu ...

  8. JDBC01 获取数据库连接

    概述 Java Database Connectivity(JDBC)直接访问数据库,通用的SQL数据库存取和操作的公共接口,定义访问数据库的标准java类库(java.sql,javax.sql) ...

  9. ORACLE中dual用法详解

    基本上oracle引入dual为的就是符合语法1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的.2. Oracle中的dual表是一 ...

  10. 集合类——Collection、List、Set接口

    集合类 Java类集 我们知道数组最大的缺陷就是:长度固定.从jdk1.2开始为了解决数组长度固定的问题,就提供了动态对象数组实现框架--Java类集框架.Java集合类框架其实就是Java针对于数据 ...