winform invokerequired==true 表示什么意思的

cloudy13414264448 2012-08-20 10:22:16
原本我觉得是判断当前线程是否创建控件线程的,但后来我觉得不是。
界面只有一个textbox和一个label控件。
代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace pro6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private delegate void FlushClient();//代理
public int i=0;
private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(CrossThreadFlush);
thread.IsBackground = true;
thread.Start();
}
private void CrossThreadFlush()
{
while (true)
{
//将sleep和无限循环放在等待异步的外面
Thread.Sleep(1000);
ThreadFunction();
}
}
private void ThreadFunction()
{
if (this.textBox1.InvokeRequired)//等待异步
{
FlushClient fc = new FlushClient(ThreadFunction);
this.Invoke(fc);//通过代理调用刷新方法
i++;
}
else
{
this.textBox1.Text = DateTime.Now.ToString();
i++;
label1.Text = i.ToString();
}
}


}
}
为什么label1先是显示1,之后就是3、5、7、9等等的数,每一个都是加2
...全文
493 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cloudy13414264448 2012-08-21
  • 打赏
  • 举报
回复
哦 好像有点明白了 十分感谢各位
cloudy13414264448 2012-08-20
  • 打赏
  • 举报
回复
奇怪的是 label1为什么先是显示1,之后就是3、5、7、9等等的数,每一个都是加2,而不是一开始就每个都是加2?
mathieuxiao 2012-08-20
  • 打赏
  • 举报
回复
一般在子线程修改主线程创建的控件时会用到。如果表达式值为true,说明子线程不能直接修改该控件,必须使用委托的方式进行处理。如果为false,则说明子线程可以直接修改控件。如txtValue = "123";
shizhu820228 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

invokerequired==true 是判断当前线程是否是UI线程,true不是UI线程。所以要使用委托。
如果是false则不用使用委托。
[/Quote]

清楚了
wangzezhen010 2012-08-20
  • 打赏
  • 举报
回复
invokerequired==true 是判断当前线程是否是UI线程,true不是UI线程。所以要使用委托。
如果是false则不用使用委托。
bdmh 2012-08-20
  • 打赏
  • 举报
回复
判断是否由异步访问的,通过线程访问ui,需要这个判断
rczjp 2012-08-20
  • 打赏
  • 举报
回复
或者这么理解BeginVoke,执行完毕之后返回到主线程(界面线程)
rczjp 2012-08-20
  • 打赏
  • 举报
回复
恩 简单来说就是Invoke是同步,会有阻塞,不会回调。BeginInvoke是异步,可以执行下面的语句。
呵呵 暂时我就这么理解来的
cloudy13414264448 2012-08-20
  • 打赏
  • 举报
回复
嗯 明白了 感谢各位 但“BeginInvoke是先在UI线程上执行i++之后,再执行fc”这个顺序好像不太懂哦,
能再说明白点吗
cloudy13414264448 2012-08-20
  • 打赏
  • 举报
回复
嗯 明白了 感谢各位 但“BeginInvoke是先在UI线程上执行i++之后,再执行fc”这个顺序好像不太懂哦,
能再说明白点吗
rczjp 2012-08-20
  • 打赏
  • 举报
回复
FlushClient fc = new FlushClient(ThreadFunction);
this.Invoke(fc);//通过代理调用刷新方法
i++;


i++;
FlushClient fc = new FlushClient(ThreadFunction);
this.Invoke(fc);//通过代理调用刷新方法

this.Invoke(fc);应该是一个执行顺序的问题,Invoke是执行fc,i++不执行,在UI线程上执行fc之后再执行i++

FlushClient fc = new FlushClient(ThreadFunction);
this.BeginInvoke(fc);//通过代理调用刷新方法
i++;


BeginInvoke是先在UI线程上执行i++之后,再执行fc


我是这么理解的,不知道对不对
superliu1122 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
奇怪的是 label1为什么先是显示1,之后就是3、5、7、9等等的数,每一个都是加2,而不是一开始就每个都是加2?
[/Quote]
你仔细分析下ThreadFunction函数的执行过程就知道了,弄不清楚就单步执行,看看i的值到底是怎么改的
rczjp 2012-08-20
  • 打赏
  • 举报
回复
this.BeginInvoke(fc);
cloudy13414264448 2012-08-20
  • 打赏
  • 举报
回复
invokerequired==true 是判断当前线程是否是UI线程,true不是UI线程。
那么开始就不是UI线程 就应该是加2把
rczjp 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
奇怪的是 label1为什么先是显示1,之后就是3、5、7、9等等的数,每一个都是加2,而不是一开始就每个都是加2?
[/Quote]i最开始是0

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧