WinForm中异步执行任务实例-按回车异步执行各任务。
2015-09-02 17:03
316 查看
//声明委托 , 用于在线程内操作线程外的控件
private delegate void SetTextCallback(Label lbl,string text);
private void txtValidateCode_KeyPress(object sender, KeyPressEventArgs e)
{
if ((int)e.KeyChar == 13)
{
//if (endPosition)
// {
// FrmBaidu frmMain = (this.ParentForm as FrmBaidu);
// frmMain.LoadUserControl();
//}
lblNote.Text = "";
TextBox validateCode = sender as TextBox;
if (validateCode.Text == "")
{
e.Handled = false;
lblNote.Text = "请输入验证码!";
}
else
{
StartSomeWorkFromUIThread();
SendKeys.SendWait("{Tab}");
}
}
}
private void StartSomeWorkFromUIThread()
{
// 我们要做的工作相对UI线程而言台慢了,用下面的方法异步进行处理
MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread);//这是入口方法
mi.BeginInvoke(null, null); // 这样就不会阻塞
}
// 缓慢的工作在此方法内进行处理,使用线程池里的线程
private void RunsOnWorkerThread()
{
try
{
//doing something......
}
catch (Exception ex)
{
SetText(lblNote,ex.Message);
}
}
//在线程内操作线程外的控件
private void SetText(Label lbl, string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (lbl.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { lbl,text });
}
else
{
lbl.Text= text;
}
}
private delegate void SetTextCallback(Label lbl,string text);
private void txtValidateCode_KeyPress(object sender, KeyPressEventArgs e)
{
if ((int)e.KeyChar == 13)
{
//if (endPosition)
// {
// FrmBaidu frmMain = (this.ParentForm as FrmBaidu);
// frmMain.LoadUserControl();
//}
lblNote.Text = "";
TextBox validateCode = sender as TextBox;
if (validateCode.Text == "")
{
e.Handled = false;
lblNote.Text = "请输入验证码!";
}
else
{
StartSomeWorkFromUIThread();
SendKeys.SendWait("{Tab}");
}
}
}
private void StartSomeWorkFromUIThread()
{
// 我们要做的工作相对UI线程而言台慢了,用下面的方法异步进行处理
MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread);//这是入口方法
mi.BeginInvoke(null, null); // 这样就不会阻塞
}
// 缓慢的工作在此方法内进行处理,使用线程池里的线程
private void RunsOnWorkerThread()
{
try
{
//doing something......
}
catch (Exception ex)
{
SetText(lblNote,ex.Message);
}
}
//在线程内操作线程外的控件
private void SetText(Label lbl, string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (lbl.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { lbl,text });
}
else
{
lbl.Text= text;
}
}
相关文章推荐
- 如何让计划任务执行时显示CMD窗口
- Could not transfer artifact *************** from/to central (http://repo1.maven.org/maven2
- 【C++】双向链表
- jS和Oc互调
- Java中Map、Set集合的遍历
- vi命令行替换
- 在oracle使用concat函数时需注意
- 多段图的最短路径问题
- spring bean的生命周期
- 面试题32.从1到n整数中1出现的次数
- Win7 保存cookies位置
- 设计模式
- Windows安装出现错误
- android 通过浏览器url打开app的设置方法
- **【ci框架】PHP的CI框架集成Smarty的最佳方式
- 转 九宫格坐标计算
- Agile——敏捷开发
- DP - hdu5000 Clone
- The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
- 排序