当前位置:  编程技术>.net/c#/asp.net

C#实现窗体与子线程的交互的方法

    来源: 互联网  发布时间:2014-11-01

    本文导语:  本文实例简述了C#实现窗体与子线程间通讯的方法,对于C#初学者有一定的借鉴价值。具体方法如下: 一般来说窗体上的UI在默认情况下不允许使用子线程(或者其它非创建控件的UI线程)去控制(这在NET2.0以下是允许的,但是...

本文实例简述了C#实现窗体与子线程间通讯的方法,对于C#初学者有一定的借鉴价值。具体方法如下:

一般来说窗体上的UI在默认情况下不允许使用子线程(或者其它非创建控件的UI线程)去控制(这在NET2.0以下是允许的,但是考虑到安全性等问题,从2.0开始就禁止使用这个功能,除非Form的CheckForIllegalCrossThreadCalls=true,不推荐这样使用)。

那么如何实现C#窗体与子线程的交互呢?具体方法如下:

一、使用Invoke或者BeginInvoke方法:

用一个线程,里边调用Invoke或者BeginInvoke方法即可:

public partial class Form1 : Form
{
public void Processing(int num)
{
int answer = 2;
Task t = new Task(() =>
{
for (int i = 3; i  { Thread.Sleep(3000); MessageBox.Show("Finished!") }));
MessageBox.Show("OK");
});
t.Start();
}
public Form1()
{
InitializeComponent();

}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("First!");
Processing(10);
}
}

这里值得注意:
1)BeginInvoke:这里的“异步”并不是针对UI线程,而是说当Control的BeginInvoke在某个子线程中调用时,子线程中BeginInvoke后面的代码(弹出“Finished”框框)会先执行,然后等到BeginInvoke中的那个委托方法完全执行完毕之后Label才会被赋值。如果改成Invoke,那么“OK”永远在Invoke的委托代码彻底执行完毕之后才被执行。
所以BeginInvoke=Invoke(在UI主线程中,所以不建议在主线程中直接这样调用)

二、线程同步SynchronizedContext:

public partial class Form1 : Form
{
public void Processing(int num,SynchronizationContext context)
{
int answer = 2;
Task t = new Task(() =>
{
for (int i = 3; i  { Thread.Sleep(3000); MessageBox.Show("Finished"); }, null);
MessageBox.Show("Last");
});
t.Start();
}
public Form1()
{
InitializeComponent();

}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("First!");
Processing(10,SynchronizationContext.Current);
}
}

和BeginInvoke、Invoke类似,需要注意:

1)SynchronizationContext:唯独在UI窗体线程中会自动初始化(button1_Click事件中SynchronizationContext.Current为当前窗体),其它线程与线程要交互,必须通过new SynchronizationContext()实现)。
2)Post方法等同于BeginInvoke作用,Send等同于Invoke作用。

大家如果仔细实验代码,还会发现无论何种情况,弹出“Finished”框框总是界面“假死”3秒,是的,证明了以上4个方法都是在UI线程上执行的(只不过是同步或者异步向窗体消息泵发送信息而已)。所以应该“一次性地把数据在子线程中先全部处理干净(在Invoke,BeginInvoke,Send或者Post前得出结果,写代码),然后一次性发送通知给窗体,更新界面即可)。

此外还需要注意:

任何委托(Delegate)也有BeginInvoke方法,它是真正的异步,一旦Invoke一定是开辟一个线程去执行的。


    
 
 

您可能感兴趣的文章:

  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • C#实现获取枚举中元素个数的方法
  • C#实现自定义双击事件
  • C#键盘输入回车键实现点击按钮效果的方法
  • C#实现获取一年中是第几个星期的方法
  • C#实现Datatable排序的方法
  • C#实现装箱与拆箱操作简单实例
  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
  • C#下实现创建和删除目录的实例代码
  • 使用C#实现在屏幕上画图效果的代码实例
  • C#实现过滤html标签并保留a标签的方法
  • c#实现TextBox只允许输入数字
  • C# Winform 整个窗口拖动的实现代码
  • c# ListView实现双击Item事件的变通方法
  • C#实现随鼠标移动窗体实例
  • C#中的FileUpload 选择后的预览效果具体实现
  • C# 窗体隐藏及任务管理器中禁止关闭的实现代码
  • C#的锯齿数组以及C++实现代码
  • C#格式化文件大小的实现代码
  • C#怎样才能实现窗体最小化到托盘呢?
  • C# char类型字符转换大小写的实现代码
  • C# 无边框窗体之窗体移动实现代码
  • .NET实现父窗体关闭而不影响子窗体的方法
  • WinForm子窗体访问父窗体控件的实现方法
  • C#最简单的关闭子窗体更新父窗体的实现方法
  • Jb7问题集锦之一!如何实现Metal风格窗体
  • C#中禁止Winform窗体关闭的实现方法
  • c# 多文档窗口修改mdi窗体背景色的实现代码
  • JBuilder中如何实现MDI窗体~?还有画图是如何实现的~?需要怎么做?偶找不到资料……
  • c# winform 关闭窗体时同时结束线程实现思路
  • Java中的MDI窗体是怎么实现的,向JBuilder那种是什么Layout?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何实现一个线程组内多线程的非同不执行,即一个线程执行完毕后再执行下一个线程???
  • socket实现多文件并发传输,求助多线程实现问题?
  • 如何实现这样的API,可同时被不同的进程/线程使用,但是又不区分进程/线程?
  • **********如何根据线程的handle,来实现挂起指定线程********
  • C++实现CreatThread函数主线程与工作线程交互的方法
  • 如何实现监控线程?
  • 不用 signal,如何实现线程的休眠与唤醒
  • 怎样实现:任意一个线程终止,就终止整个进程?
  • 我需要一个模型,在 LINUX C 下。实现线程间的控制,执行,阻塞,再执行。。。。。不知道如何实现。
  • 如何实现多线程下的文件锁?
  • linux下如何实现线程的启动,暂停,和退出!
  • 为什么linux没有在内核实现多线程机制‏
  • JAVA实现线程的三种方法
  • 用户态能否实现信号量机制,来提供线程间互斥和同步的功能?
  • 如何实现线程的“即时创建,即时销毁”?
  • 锁定Vector类型,使其同一时刻只能有一个线程访问,怎么实现??
  • 如何在APACHE环境下实现下载限制为单线程!
  • openmp线程实现原理
  • 请问Runnable接口为什么能实现多线程?
  • 想写个FTP多线程下载工具但有几个实现细节问题
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • interface 到底有什么用???实现接口,怎么实现??
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 怎么用Jsp实现在页面实现树型结构?
  • 通过javascript库JQuery实现页面跳转功能代码
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 网站重定向用C语言实现iptables,ACL实现
  • php实现socket实现客户端和服务端数据通信源代码
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • flash AS3反射实现(describeType和getDefinitionByName)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3