现在编程里多线程是常用的,而vs2005中如果有一个控件,又不能在非创建它的线程中修改它的属性,那就必须用委托。
public delegate void ShowInformation(string str);//显示信息
/// <summary>
/// 显示信息
/// </summary>
void ShowInfo(string StrInfo)
{
Invoke(new ShowInformation(OnshowInformation), StrInfo);
}
void OnshowInformation(string StrInfo)
{
lblInfo.Text = StrInfo;
lblLocalVer.Text =Convert.ToString ( LocalVer);
lblServerVer.Text =Convert .ToString( ServerVer);
lblFilesCount.Text = Convert.ToString(intFilesCount);
}要是这样的控件多了,不是麻烦了吗???
public delegate void ShowInformation(string str);//显示信息
/// <summary>
/// 显示信息
/// </summary>
void ShowInfo(string StrInfo)
{
Invoke(new ShowInformation(OnshowInformation), StrInfo);
}
void OnshowInformation(string StrInfo)
{
lblInfo.Text = StrInfo;
lblLocalVer.Text =Convert.ToString ( LocalVer);
lblServerVer.Text =Convert .ToString( ServerVer);
lblFilesCount.Text = Convert.ToString(intFilesCount);
}要是这样的控件多了,不是麻烦了吗???
解决方案 »
- 一个超高端的问题,论坛里的大牛们都进来研究下
- 如何打开打印机属性对话框
- C#添加新项目中没有其他项目
- 乱码问题,在线等!!!
- 求解决,如下
- 部署怎样将SQL Server2000的操纵部署到安装文件中??
- ★DataAdapter 不能更新数据库
- 标示 异常出现在 system.windows.forms.dll 中。 数据网格表样式集合已包含具有同一映射名称的表样式,高手来啊,急急急~~~~~~~~~~~~~~~~
- docker build .net core 项目报错
- Infragistics.UltraChart插件怎么画下面的图
- 帮忙修改下面的样式表,显示名字不同的链接,如有名字相同的不显示。
- 水晶报表(crystal report)如何传递参数,DB是ACCESS. rpt已经做好,但在编写时总会找不到方法... 急,在线等复
应该只是不能修改于外观相关的属性值吧,这样没办法,线程安全本来就.NET的一个特性来的
一般而言“线程安全”由多线程对共享资源的访问引起。如果调用某个接口时需要我们自己采取同步措施来保护该接口访问的共享资源,则这样的接口不是线程安全的.MFC和STL都不是线程安全的. 怎样才能设计出线程安全的类或者接口呢?如果接口中访问的数据都属于私有数据,那么这样的接口是线程安全的.或者几个接口对共享数据都是只读操作,那么这样的接口也是线程安全的.如果多个接口之间有共享数据,而且有读有写的话,如果设计者自己采取了同步措施,调用者不需要考虑数据同步问题,则这样的接口是线程安全的,否则不是线程安全的。
有此一说,因为HWND与CWnd*之前的转换用到了一个TLS的MAP.
一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。 现在用一个用线程控制的进程条来说明,大致的步骤如下:1. 创建Invoke函数,大致如下: /// <summary> /// Delegate function to be invoked by main thread /// </summary> private void InvokeFun() { if( prgBar.Value < 100 ) prgBar.Value = prgBar.Value + 1; } 2. 子线程入口函数: /// <summary> /// Thread function interface /// </summary> private void ThreadFun() { //Create invoke method by specific function MethodInvoker mi = new MethodInvoker( this.InvokeFun ); for( int i = 0; i < 100; i++ ) { this.BeginInvoke( mi ); Thread.Sleep( 100 ); } } 3. 创建子线程: Thread thdProcess = new Thread( new ThreadStart( ThreadFun ) ); thdProcess.Start(); 备注: using System.Threading; private System.Windows.Forms.ProgressBar prgBar; 运行后的效果如下图所示:
取消线线程安全保护模式!
举个很简单的例子
private int _i;public void MethodA( int i )
{
_i = i;
//处理......
MethodB();
//......
}private void MethodB()
{
int k = _i;//冲突发生在这里。
}
如果两个线程同时调用MethodA,那么_i的值就不可预测,导致MethodB的行为也不可预测,这就是线程冲突……
加入该句:Control.CheckForIllegalCrossThreadCalls = False
取消线线程安全保护模式!
这会使控件以与在 Visual Studio 2003 下相同的方式运行。
如果在vs2003中用的很坦然,到vs2005中把这个手动取消了,总觉得有点...
18144686
在这里我们真正的做到只讨论技术!
做广告者勿扰!谢谢!