Winform中子线程访问界面控件时被阻塞解决方案
public partial class WebData_Import : Form
{
//声明用于访问主界面的委托类型
public delegate void deleGetOrderdata(string info);
//声明访问主界面委托类型的变量
public deleGetOrderdata OptGetOrderData;
int CompanyID = ;
public WebData_Import()
{
InitializeComponent();
cmbCompany.Items.Insert(, "公司001");
cmbCompany.Items.Insert(, "公司002");
cmbCompany.SelectedIndex = ;
//实例化委托
OptGetOrderData = new deleGetOrderdata(ShowOperationInfo);
} private void button1_Click(object sender, EventArgs e)
{
txtOperationInfo.Text = "";
switch (cmbCompany.SelectedIndex)
{
case :
CompanyID = ;
break;
case :
CompanyID = ;
break;
}
//执行获取订单数据线程
Thread GetOrderDataThread = new Thread(new ThreadStart(ExecuteGetOrderData));
GetOrderDataThread.Start();
} /// <summary>
/// 访问主界面的方法
/// </summary>
/// <param name="ShowInfo"></param>
private void ShowOperationInfo(string ShowInfo)
{
txtOperationInfo.Text += ShowInfo + "\r\n";
} private void ExecuteGetOrderData()
{
DataTable GetOrderData = new DataTable();
//使用BeginInvoke从子线程访问主界面,传入访问主界面的方法和参数
this.BeginInvoke(OptGetOrderData, "1、导入数据操作开始");
this.BeginInvoke(OptGetOrderData, "\r\n2、正在获取数据,请稍后...");
try
{
GetOrderData = GetOrderTable(CompanyID, Convert.ToDateTime(Sdate.Text), Convert.ToDateTime(Edate.Text));
if (GetOrderData == null)
{
throw new Exception("没有从远程服务获取到任何数据");
}
this.BeginInvoke(OptGetOrderData, "\r\n3、已获取" + GetOrderData.Rows.Count + "条数据,正在执行往数据库插入操作...");
SQLDBHELPER help = new SQLDBHELPER();
int InsertCount = help.SqlInsertBuilder(GetOrderData);
this.BeginInvoke(OptGetOrderData, "\r\n4、成功插入" + InsertCount + "条数据,正在执行存储过程请稍后...");
string ErrorMessage = help.exectrans();
if (string.IsNullOrEmpty(ErrorMessage.Trim()))
{
this.BeginInvoke(OptGetOrderData,"\r\n5、存储过程执行成功,所有操作均已成功执行完毕!");
}
else
{
this.BeginInvoke(OptGetOrderData, "\r\n5、存储过程执行失败!失败原因:" + ErrorMessage);
}
}
catch (Exception ex)
{
this.BeginInvoke(OptGetOrderData, "\r\n系统执行异常,异常原因:" + ex.Message);
}
}
}
Winform中子线程访问界面控件时被阻塞解决方案的更多相关文章
- 跨线程访问UI控件时的Lambda表达式
工作中经常会用到跨线程访问UI控件的情况,由于.net本身机制,是不允许在非UI线程访问UI控件的,实际上跨线程访问UI控件还是 将访问UI的操作交给UI线程来处理的, 利用Control.Invok ...
- WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...
- 理解SynchronizationContext,如何在Winform里面跨线程访问UI控件
SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文. 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为.此模型 ...
- C# Winform 跨线程更新UI控件常用方法总结(转)
出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...
- WinForm 简易仿360界面控件
因为经常要做一些1.2千行的小工具,WinForm自带的TabCtrl又不美观,所以想做成360的样子,在网上找来找去,都只有散乱的代码,没有可以通用的结构,于是自己写了一个简易的通用控件. 控件主要 ...
- 实现 winform 异步跨线程访问UI控件
在开发winform时经常会用到多线程防止界面出现假死现象,比如当你单击某个按钮时,需要执行很多代码,但是在执行过程中想实时的将当前执行的情况报告给用户,类型进度条或文本什么的. 这个时候很显然,如果 ...
- wpf(怎么跨线程访问wpf控件)
在编写代码时,我们经常会碰到一些子线程中处理完的信息,需要通知另一个线程(我这边处理完了,该你了). 但是当我们通知WPF的UI线程时需要用到Dispatcher. 首先我们需要想好在UI控件上需要显 ...
随机推荐
- redis的5种数据结构的简介
5种数据结构 1.字符串 Redis 字符串是一个字节序列.在 Redis 中字符串是二进制安全的,这意味着它们没有任何特殊终端字符来确定长度,所以可以存储任何长度为 512 兆的字符串. 示例 12 ...
- vector -1
vector的特色有支持随机存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时. vector以模板(泛型)方式实现,可以保存任意类型的变数,包括使用者自定义的资料型态,例如:它可以是放置整 ...
- (转+原)python中的浅拷贝和深拷贝
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069722.html 原网址: http://blog.csdn.net/sunshine_in_mo ...
- mysql(mariadb)重装
MariaDB是MySQL的一个分支,主要由开源社区进行维护和升级,而MySQL被Oracle收购以后,发展较慢.在CentOS 7的软件仓库中,将MySQL更替为了MariaDB. Centos ...
- HTML布局总结
网页的三大元素结构(内容html标签)+表现(布局CSS)+行为(js) CSS选择器1.标记选择器2.类别选择器(.red)3.ID选择器(#name)4.复合选择器(交集选择器 标记选择器+类别 ...
- POJ 2986 A Triangle and a Circle
题意:给定一个三角形,以及一个圆的圆心坐标和半径,求圆和三角形的相交面积. 思路: 用三角剖分,三角形上每个线段都变成这个线段与圆心的三角形,然后算出每个三角形与圆的相交面积,然后根据有向面积的正负累 ...
- The Most Wanted Letter
The Most Wanted Letter You are given a text, which contains different english letters and punctuatio ...
- pl/sql执行动态sql
SQL> declare msql varchar2(200); begin loop msql := 'select * from bfw_test' ...
- javabeans的运用
javabeans的运用 对javabean的使用我开始严重的郁闷,跟着书上说的做,但是总是不成功.后来别人说我是基础不牢靠.我觉得应该从servlet学起然后再加进入JSP学是非常快的,对于JAVA ...
- 如何使用WCF调试器WcfTestClient.exe
如果启用服务出现如下异常 请启用下面该服务 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE 文件->添加服务 地 ...