C# winform编程中多线程操作控件方法
private void Form1_Load(object sender, EventArgs e)
{
Thread newthread = new Thread(new ThreadStart(BackgroundProcess));
newthread.Start(); } /// <summary>
/// 定义一个代理
/// </summary>
private delegate void CrossThreadOperationControl(); private void BackgroundProcess()
{
// 将代理实例化为一个匿名代理
CrossThreadOperationControl CrossDelete = delegate()
{
int i = ;
while (i < )
{
// 向列表框增加一个项目
listBox1.Items.Add("Item " + i.ToString());
i++;
}
label1.Text = "我在新线程里访问这个lable!";
listBox1.Items.Add(label1.Text);
};
listBox1.Invoke(CrossDelete);
}
收集一下,在C# winform编程中多线程操作控件时,可以有下面种方法:
1. 又看到一种方法(2014.1.6):
1. 刚看到一种方法(2014.1.5):
private void btnTest_Click(object sender, EventArgs e)
{
if (this.txtIP.Text.Trim() != "" && this.txtPort.Text.Trim() != "")
{
string proxy = this.txtIP.Text.Trim() + ":" + this.txtPort.Text.Trim();
string result = string.Empty;
this.btnTest.Enabled = false;
new Thread(delegate
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
HttpClient httpClient = new HttpClient();
httpClient.Proxy = new WebProxy(proxy);
httpClient.TimeOut = ;
object result;
try
{
string a = httpClient.Get("http://www.baidu.com", "", "", "", "", "get");
if (a != "")
{
result = "响应成功!";
}
else
{
result = "响应失败!";
}
}
catch
{
}
stopwatch.Stop();
result = result;
result = string.Concat(new object[]
{
result,
",响应花费:",
stopwatch.ElapsedMilliseconds,
"ms"
});
this.BeginInvoke(delegate
{
this.lbResult.Text = result;
this.btnTest.Enabled = true;
});
})
{
IsBackground = true
}.Start();
}
else
{
this.lbResult.Text = "请输入完整再提交!";
}
}
1. 直接使用表达式和Action()
private void btnInitEnv_Click(object sender, EventArgs e)
{
//初始化环境时回显出来的文字不让看
try
{
this.textBoxOutPut.Clear();
this.btnInitEnv.Enabled = false;
this.labelStateInfo.Text = "";
this.labelStateInfo.ForeColor = Color.Red; if (!WriteToSerialPort("diags"))
{
this.btnInitEnv.Enabled = true;
return;
} Thread thread = new Thread(new ThreadStart(() =>
{
int i = ;
bool flagFind = false;
StringBuilder sb = new StringBuilder(); while (true)
{
Thread.Sleep();
this.Invoke(new Action(() =>
{
sb.Append(this.textBoxOutPut.Text);
this.textBoxOutPut.Clear();
if (sb.ToString().Contains("Entering recovery mode, starting command prompt"))
{
this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
DateTime.Now.ToString(PubilcConstVar.TimeFormat),
"Entering recovery mode, starting command prompt, Stop.\r\n"));
this.labelStateInfo.ForeColor = Color.Red;
this.labelStateInfo.Text = "初始化失败,请手动输入命令初始化";
flagFind = true;
this.btnInitEnv.Enabled = true;
}
else if (sb.ToString().Contains(":-)"))
{
this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
DateTime.Now.ToString(PubilcConstVar.TimeFormat),
"进入操作模式成功\r\n"));
this.labelStateInfo.ForeColor = Color.Blue;
this.labelStateInfo.Text = "初始化成功";
flagFind = true; //将业务按钮使能
EnableBussinessButtons();
}
})); if (flagFind || ++i > ) //找开标志或10秒超时中断
{
break;
}
} if (!flagFind)
{
this.Invoke(new Action(() =>
{
this.textBoxOutPut.Clear();
this.labelStateInfo.ForeColor = Color.Red;
this.labelStateInfo.Text = "初始化失败,超时";
this.btnInitEnv.Enabled = true; DisableBussinessButtons();
}));
}
})); thread.IsBackground = true;
thread.Start();
}
catch (Exception ex)
{
this.log.Write(ex.ToString());
}
}
2. 使用线程函数加action()
private void btnInitEnv_Click(object sender, EventArgs e)
{
//初始化环境时回显出来的文字不让看
try
{
this.textBoxOutPut.Clear();
this.btnInitEnv.Enabled = false;
this.labelStateInfo.Text = "";
this.labelStateInfo.ForeColor = Color.Red; if (!WriteToSerialPort("diags"))
{
this.btnInitEnv.Enabled = true;
return;
} Thread thread = new Thread(new ThreadStart(MonitorOutPutThread)); thread.IsBackground = true;
thread.Start();
}
catch (Exception ex)
{
this.log.Write(ex.ToString());
}
}
线程函数:
private void MonitorOutPutThread()
{
int i = ;
bool flagFind = false;
StringBuilder sb = new StringBuilder(); while (true)
{
Thread.Sleep();
this.Invoke(new Action(() =>
{
sb.Append(this.textBoxOutPut.Text);
this.textBoxOutPut.Clear();
if (sb.ToString().Contains("Entering recovery mode, starting command prompt"))
{
this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
DateTime.Now.ToString(PubilcConstVar.TimeFormat),
"Entering recovery mode, starting command prompt, Stop.\r\n"));
this.labelStateInfo.ForeColor = Color.Red;
this.labelStateInfo.Text = "初始化失败,请手动输入命令初始化";
flagFind = true;
this.btnInitEnv.Enabled = true;
}
else if (sb.ToString().Contains(":-)"))
{
this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
DateTime.Now.ToString(PubilcConstVar.TimeFormat),
"进入操作模式成功\r\n"));
this.labelStateInfo.ForeColor = Color.Blue;
this.labelStateInfo.Text = "初始化成功";
flagFind = true; //将业务按钮使能
EnableBussinessButtons();
}
})); if (flagFind || ++i > ) //找开标志或10秒超时中断
{
break;
}
} if (!flagFind)
{
this.Invoke(new Action(() =>
{
this.textBoxOutPut.Clear();
this.labelStateInfo.ForeColor = Color.Red;
this.labelStateInfo.Text = "初始化失败,超时";
this.btnInitEnv.Enabled = true; DisableBussinessButtons();
}));
}
}
3. 就是使用委托,这个网上例子很多,不再实现
C# winform编程中多线程操作控件方法的更多相关文章
- 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件
项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...
- 在Winform窗体中使用WPF控件(附源码)
原文:在Winform窗体中使用WPF控件(附源码) 今天是礼拜6,下雨,没有外出,闲暇就写一篇博文讲下如何在Winform中使用WPF控件.原有是我在百度上搜索相关信息无果,遂干脆动手自己实现. W ...
- WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色
本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...
- C#里WinForm开发中如何实现控件随窗体大小的改变而自动适应其改变(转)
在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大小并且能重新定位?此时就要借助控件的.Anchor属性.Anchor属性定义控件的定位点位置.当控件锚定到某个 ...
- Windows编程中各种操作文件的方法
windows编程中文件操作有以下几种常见方法:1.C语言中文件操作.2.C++语言中的文件操作.3.Win32 API函数文件操作.4.MFC CFile类文件操作.5.MFC CFileDialo ...
- C# WinForm程序中使用Unity3D控件 (转)
https://www.cnblogs.com/cnxkey/articles/5394378.html 最近在自学Unity3D,打算使用这个时髦.流行.强大的游戏引擎开发一个三维业务展示系统,不过 ...
- winform自定义控件中其他遮挡控件点击事件
自定义控件在其他窗口调用时,里面的lable阻挡了控件的点击事件 解决方法 自定义控件中lable的 点击事件 private void Lable1_Click(object sender, Eve ...
- QTP描述性编程中往WebEdit控件输入文字问题
在网上查找到许多相关的描述性编程的案例,自己就想动手一试,于是在专家视图中输入如下代码: systemUtil.Run "http://www.baidu.com" wait(15 ...
- WinForm中跨线程操作控件
在WinForm编程时会遇到通过后台线程操作界面的情况,直接在后台线程执行的方法中直接操作控件会报错,这时候就要使用跨线程方式间接操作控件.下面是两种实现方式. 1.采用定义delegate的方式 ...
随机推荐
- poj 3048 Max Factor(素数筛)
这题就是先写个素数筛,存到prime里,之后遍历就好,取余,看是否等于0,如果等于0就更新,感觉自己说的不明白,引用下别人的话吧: 素数打表,找出20000之前的所有素数,存入prime数组,对于每个 ...
- 加入ScrollView后OnGestureListener无效的解决办法
android中,ViewFlipper+OnGestureListener可以实现左右滑动效果. 但是在ViewFlipper加上了ScrollView就悲剧了,左右滑动事件无效了…… 这里其实只需 ...
- (转)linux中fork()函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...
- db2删除数据库
1.断开所有连接 db2 stop application all force 2.停止数据库 db2stop 3.删除数据库(系统管理员权限下)db2 drop 数据库name
- iOS8远程通知处理
// IOS8 新系统需要使用新的代码注册推送if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){ [[UI ...
- dev 注册方法 z
工具栏注册方法: 1.将下面的内容保存为 bat文件,放到 Components\Tools\ 目录下,然后双击执行.注意,可能需要管理员权限. 忘了一点,components.xml 文件中的 P ...
- 如何设置BIOS使服务器断电后再来电能自动开机
不同的主板及CMOS型号相对应的选项会有所不同,但我想应该不会差太多,一般都在[POWER MANAGEMENT SETUP]和[Integrated Peripherals]这两个选项中.下面介绍两 ...
- 手机抓包 http tcp udp?
1.电脑做wifi热点,手机连上后电脑上使用wireshark抓包 该方法手机无须root,并且适用于各种有wifi功能的手机(IOS.android等).平板等.只要电脑的无线网卡具有无线承载功能, ...
- (整理)C#实现UDP广播
(一) IP地址解析 IP地址的类型:XXX.XXX.XXX.XXXA类: 1.0.0.1--126.255.255.254 最高位是0: 1个字节的网络地址和3个地址的主机地址 测试地址:127.X ...
- 什么是条带化(striping) ?(转载)
条带(strip)是把连续的数据分割成相同大小的数据块,把每段数据分别写入到阵列中的不同磁盘上的方法.简单的说,条带是一种将多个磁盘驱动器合并为一个卷的方法. 许多情况下,这是通过硬件控制器来完成的. ...