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控件上需要显 ...
随机推荐
- oracle 存储过程返回结果集 (转载)
好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...
- JS生成不重复随机数
说明 我们可以用Math.random()的方法轻松的生成 一个随机的数字,但是这个数字可能是重复的.有时候,我们需要一个不重复的随机数,可以用很多的方法来实现这个要求,以下方法是效率最高的. 解释 ...
- hdu3714 三分
Error Curves Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- nyoj 最少步数
算法:搜索(深度优先搜索) 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1, ...
- C/C++中的虚析构函数和私有析构函数的使用
代码: #include <iostream> using namespace std; class A{ public: A(){ cout<<"construct ...
- 影响MySQL性能的五大配置参数
我们今天主要和大家分享的是对MySQL性能影响关系紧密的五大配置参数,以下就是文章的具体内容描述,希望会给你带来一些帮助在此方面. 以下的文章主要是对MySQL性能影响关系紧密的五大配置参数的介绍,我 ...
- js过滤emoji表情符号
手机端常常会遇到用户输入框,输入emoji,如果是数据库是UTF8,会遇到报错:SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for ...
- eclipse Content Assist 无法使用,不能自动补全的解决办法
今天用eclipse写JAVA代码,写着写着突然,eclipse 的自动补全功能失效了,没办法自动补全.折腾半天,终于解决了. 在window->Preferences->Java-> ...
- Tempter of the Bone--hdu1010--zoj2110
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- $(function(){})与(function($){....})(jQuery)的区别
$(function(){}); 全写为 $(docunemt).ready(function(){ }); 意义为在DOM加载完毕后执行ready()方法 (function($){....})(j ...