在WinForm中,很多情况下需要用到多线程,下面我来简单介绍一下多线程的基本用法。

1.线程。
 
(1)线程的初始化 
Thread t = new Thread(new ThreadStart(ThreadProc));
其中,ThreadStart是一个系统定义的委托,ThreadProc是一个方法的名称,其签名与ThreadStart一样。
 
线程的启动:
(2)t.Start();
这样子,ThreadProc方法就会执行了。t 默认是一个非主线程,并且是一个前台线程。
 
(3)主线程等待子线程结束后再继续运行:
t.Join();
这个方法的意思是,主线程暂时挂起,等待线程t运行结束以后,主线程再激活,继续运行。
 
(4)当前线程休眠:
System.Threading.Thread.Sleep(time);
//time表示当前线程挂起的毫秒数。
 
2.线程池。
 
由于新增线程的开销是非常大的,所以,如果这个任务不是十分紧急且重要的话,不妨使用CRL线程池。CRL线程池是 .net 的一种分配线程的机制。它会根据任务量自动分配线程,并且是线程的利用率最大化,从而减小性能开销。
 
(1)想线程池队列中添加任务:
ThreadPool.QueueUserWorkItem(new WaitCallback(myFunction));
其中,QueueUserWorkItem方法是ThreadPool的静态方法,其作用是向当前进程的线程池队列中添加一个任务,他的参数是一个WaitCallBack委托的对象。WaitCallBack是系统定义的一个委托,其签名如下,
public delegate void WaitCallback(object state);
这就将MyFunction这个方法作为一个线程,添加到了线程池中,等待线程池的调用。
 
3.Invoke() 和 BeginInvoke() 方法。
 
大家都知道,不同的线程之间,程序和数据时互不干扰的。但是,在WinForm中,如果其他线程想要在执行完毕后,将其结果显示到UI界面上的话,程序就会出现异常,大概意思就是说,某控件不是在该线程中创建的,所以该线程不能访问器句柄(即对象,本质是一个指针)。那么,怎么解决这个问题呢?其实,这些问题,微软早就考虑到了。Control类中有Invoke() 和 BeginInvoke() 方法,他们就是用来处理其他线程访问UI线程数据的。我现在给大家写一个例子,让界面的一个label一直显示当前时间,并不断刷新。
 
 
首先,打开一个WinForm程序,往窗体上拖一个label。
然后添加命名空间 Using System.Threading ;
在把下面的代码写到Form1.cs中
        /// <summary>
/// 这个方法实现更新label,让它显示当前时间
/// </summary>
/// <param name="o"> 这里的这个参数没有意义,只是为了符合某个委托的签名</param>
private void ShowTime(object o)
{
while (true)
{
BeginInvoke(new Action(() => { label1.Text = "当前时间:" + DateTime.Now.ToString(); }));
Thread.Sleep();
}
}
 
但是,怎么让label一直更新呢,这就需要再开一个线程,我们不妨利用线程池。
我们注册一个Form1的Load事件,然后在这个事件中写下下一行代码:
 
ThreadPool.QueueUserWorkItem(new WaitCallback(ShowTime));
 
好了,下面这个功能就做好了。
下面,我解释一下里面的一些东西。
 
BeginInvoke是Control类的一个方法,其参数是一个WaitCallBack委托的对象。
new Action(() => { label1.Text = "当前时间:" + DateTime.Now.ToString(); }),这是一个匿名方法,Action的参数是一个Lambda表达式。Action是系统定义的一个委托,其签名如下:
public delegate void Action();即空返回值,空参数。

多线程,线程池与BeginInvoke()的更多相关文章

  1. C#多线程--线程池(ThreadPool)

    先引入一下线程池的概念: 百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行, ...

  2. linux C 多线程/线程池编程 同步实例

    在多线程.线程池编程中经常会遇到同步的问题. 1.创建线程 函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, ...

  3. java多线程--线程池的使用

    程序启动一个新线程的成本是很高的,因为涉及到要和操作系统进行交互,而使用线程池可以很好的提高性能,尤其是程序中当需要创建大量生存期很短的线程时,应该优先考虑使用线程池. 线程池的每一个线程执行完毕后, ...

  4. java多线程-线程池

    线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等. 我们可以把并发执行的任务传递给一个线程池, ...

  5. C# 多线程线程池( 一 )

    我们将在这里进一步讨论一些.NET类,以及他们在多线程编程中扮演的角色和怎么编程.它们是: System.Threading.ThreadPool 类 System.Threading.Timer 类 ...

  6. Java多线程——线程池

    系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...

  7. 【Python】多线程-线程池使用

    1.学习目标 线程池使用 2.编程思路 2.1 代码原理 线程池是预先创建线程的一种技术.线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中.这些线程都是处于睡眠状态,即均为启动,不消耗 ...

  8. java多线程——线程池源码分析(一)

    本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 通常应用多线程技术时,我们并不会直接创建一个线程,因为系统启动一个新线程的成本是比较高的,涉及与操作系统的交互, ...

  9. java多线程----线程池源码分析

    http://www.cnblogs.com/skywang12345/p/3509954.html 线程池示例 在分析线程池之前,先看一个简单的线程池示例. 1 import java.util.c ...

随机推荐

  1. TCL服务器端

    import socket def main(): # 创建套接字对象 tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STR ...

  2. LightOJ - 1214-Large Division(数学,同余)

    链接: https://vjudge.net/problem/LightOJ-1214 题意: Given two integers, a and b, you should check whethe ...

  3. 如何使用python内置的request发送JSON格式的数据

    使用步骤如下: 一.如果想发送json格式的数据,需要使用request模块中的Request类来创建对象,作为urlopen函数的参数 二.header中添加content-type为applica ...

  4. SublimeCodeIntel 所有代码提示和补全插件 All Autocomplete 插件搜索所有打开的文件来寻找匹配的提示词

    SublimeCodeIntelSublimeCodeIntel 作为一个代码提示和补全插件,支持 JavaScript.Mason.XBL.XUL.RHTML.SCSS.Python.HTML.Ru ...

  5. 51nod 1565 模糊搜索 FFT

    这...好强啊\(QwQ\) 思路:卷积?\(FFT\)? 提交:\(5\)次 错因:一开始的预处理写错了(竟然只错了最后几个大点)闹得我以为\(FFT\)写挂了\(QwQ\) 题解: 对四种字符分开 ...

  6. 009——Matlab调用cftool工具的函数方法

    (一)参考文献:http://blog.sina.com.cn/s/blog_4a0a8b5d0100uare.html (二)视频教程:https://v.qq.com/x/page/x30392r ...

  7. SQL Server查询性能

    sql server常用语句总结 http://ace105.blog.51cto.com/639741/792519 SQL Server 性能调优(一)--从等待状态判断系统资源瓶颈        ...

  8. 开源是个巨大的坑,谁来帮帮我 - smartmontools 虐我记

    最近在试用smartmontools,感觉还行,于是乎想找来源码改改试试,这下可好,掉坑里了.呜呜呜... smartmontools的源码在这里可以看到:https://www.smartmonto ...

  9. PHP 连接本地mysql

    <?php echo microtime(true); ?> <?php $servername = "localhost"; $username = " ...

  10. Java中使用md5进行hash运算

    public class Md5Util { /** * @author Bean_bag * @description 进行Hash运算 * * @param input 参数字符串 * @retu ...