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控件上需要显 ...
随机推荐
- Windows命令行(DOS命令)教程-6 (转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_5.html
8. type [功能] 在屏幕上显示文本文件内容命令 [格式] type [C:][path]filename.ext [说明] type命令用来在屏幕上快速.简便地显示文本文件的内容,扩展名为TX ...
- IOS网络开发实战(一)
1 局域网群聊软件 1.1 问题 UDP协议将独立的数据包从一台计算机传输到另外一台计算机,但是并不保证接受方能够接收到该数据包,也不保证接收方所接收到的数据和发送方所发送的数据在内容和顺序上是完 ...
- C++中的类指针
代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...
- Reverse digits of an integer.
class Solution { public: int reverse(int x) { ;//long 是怕中间过程溢出 <<,max=-min-){ ans=ans*+x%; x=x ...
- OpenCV——ANN神经网络
ANN-- Artificial Neural Networks 人工神经网络 //定义人工神经网络 CvANN_MLP bp; // Set up BPNetwork's parameters Cv ...
- :before与:after伪类的应用
1.小三角样式
- 如何利用putty的密钥登陆
1.登陆主机,输入:mkdir /root/.ssh(创建SSH密钥目录) touch /root/.ssh/authorized_keys (创建SSH密钥文件): 2.输入:vi /root/ ...
- js中几个容易混淆的概念
1. var name = "The Window";var object = {name : "My Object",getName: function(){ ...
- hdu Game of Connections
卡特兰数 递推公式:h(n)=h(n-1)*(4*n-2)/(n+1); import java.math.BigInteger; import java.util.Scanner; public c ...
- Send竞争对手:百度云一小时,QQ超大附件最多支持2G,邮件附件20M到50M不等(附国外所有storage列表)——痛点是,最大传输2G,最大容量只有3G(和微云不是一回事),转存到微云文件不能超过1G
QQ邮箱最大可发送50M普通附件(群邮件则限制在2M).此外也可以使用超大附件功能,支持将1G的文件发往任意邮箱.QQ邮箱根据你的QQ邮箱容量的不同制定相应的接受附件限制,包括附件在内,2G用户所发送 ...