`
totoxian
  • 浏览: 1030687 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

跨线程访问窗体控件

阅读更多

跨线程访问窗体控件

左直拳

我写了一个函数,里面访问到了窗体上的控件。

看起来没有什么问题。

然后开启了一个线程,让它执行此函数。结果运行时报错:跨线程访问窗体控件,在非创建该控件的线程上试图访问该控件。

后来查了帮助,才知道怎么一回事。帮助说:

访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。

怎样才算安全?

在给控件赋值或设置前,先看看方法调用时是否必须调用 Invoke 方法。

Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。

//委托

delegate void SetEnableCallback(System.Windows.Forms.Control objCtrl, bool enable);

//声明

private void _SetText<TObject>(TObject objCtrl, string text)

where TObject : System.Windows.Forms.Control

{

if (objCtrl.InvokeRequired)

{

SetTextCallback d = new SetTextCallback(_SetText);

this.Invoke(d, new object[] { objCtrl, text });

}

else

{

objCtrl.Text = text;

}

}

//调用

public int TotalNum

{

set { _SetText<TextBox>(this.txt_Total, value.ToString()); }

}

有关具体内容,请查阅帮助如何:对 Windows 窗体控件进行线程安全调用

分享到:
评论

相关推荐

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    下面小编就为大家分享一篇浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题,具有很好的参考价值,希望对大家有所帮助

    跨线程访问Windows窗体控件

    跨线程访问Windows窗体控件,线程带多参数。 跨线程访问Windows窗体控件,线程带多参数。

    跨线程进行Windows窗体控件的访问

    访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问...

    委托与跨窗体访问控件代码

    学习委托,跨线程访问窗体控件很好的例子

    从线程操作主窗体控件

    如果从线程中直接读写主窗体控件,往往会提示:线程间操作无效 从不是创建控件“___”的线程访问它的错误,这个示例说明如何通过回调方法安全操作主窗体控件

    vb.net2012操作跨窗体控件(单线程和多线程两种方法)实例

    这是一个关于如何跨窗体操作控件或过程的一个例子。比如,你想用窗体A的按键来执行窗体B的文本框变色。 Imports System Imports System.Threading Imports System.Text Public Class Form1 Private Sub Form1_...

    多线程操作窗口源码2012813

    现访问竞争等问题,是不允许跨线程访问窗体控件的。 如果强行访问,则会引发InvalidOperationException 无效操作异常 为了实现跨线程访问控件,.NET Framework为每个控件 提供了InvokeRequired属性和Invoke方法。...

    多线程操作窗口源码

    现访问竞争等问题,是不允许跨线程访问窗体控件的。 如果强行访问,则会引发InvalidOperationException 无效操作异常 为了实现跨线程访问控件,.NET Framework为每个控件 提供了InvokeRequired属性和Invoke方法。...

    WinForm(C#)中跨线程访问控件的解决方法

    WinForm(C#)中跨线程访问控件的解决方法 由于多线程可能导致对控件访问的不一致,导致出现问题。C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出异常。 ...

    C#中WPF使用多线程调用窗体组件的方法

    主要介绍了C#中WPF使用多线程调用窗体组件的方法,涉及C#中多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    C#中跨线程访问控件问题解决方案分享

    net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件。 第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出错不敢...

    C#之WinForm跨线程访问控件实例

    主要介绍了C#之WinForm跨线程访问控件,实例讲述了跨线程访问控件的简单实现方法与用法,需要的朋友可以参考下

    C# 线程A访问非线程A创建的控件 、 线程内创建窗体置顶显示ShowDialog

    本资源内容:1、线程A访问非线程A创建的控件的三种方式 2、线程中创建的窗体置顶显示ShowDialog的方法。

    Winform跨线程操作的简单方法

    分析:label标签控件是主线程创建的,不能直接从另一个线程... 这样,我们就是在需要窗体控件产生变化的时候,发消息通知主窗体改变控件。这就完全避免了跨线程操作控件。 您可能感兴趣的文章:在多线程中调用winform窗体

    ASP.NET工厂模式三层架构增删改查分页源码

    1、提供跨线程安全访问控件示例。 2、提供将异常信息保存为txt文件功能。 3、提供程序只能运行1个实例,即不允许打开多个本程序的示例。 4、提供捕获未知异常功能,防止程序发生未捕获异常而崩溃。 5、提供窗体...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    4.3 跨语言集成 218 4.3.1 通用类型系统 218 4.3.2 元数据 219 4.3.3 对元数据更好的支持 219 4.3.4 属性 220 4.3.5 reflection api 222 4.4 il反汇编程序 222 4.5 内存管理 223 4.5.1 传统的垃圾...

    WHC第三方控件

    1. 跨线程的控件安全访问方式(CallCtrlWithThreadSafety.cs) 2. CheckBoxList(CheckBoxListUtil.cs) 3. 窗口管理类(ChildWinManagement.cs) 4. 由马丁•米勒http://msdn.microsoft.com/en-us/library/ms996492.aspx...

    Delphi5开发人员指南

    9.11.2 访问DLL中的共享数据 259 9.12 引出DLL中的对象 261 9.13 总结 265 第10章 Delphi 5的打印 266 10.1 TPrinter对象 266 10.2 TPrinter.Canvas 267 10.3 简单打印 267 10.3.1 打印TMemo组件中的内容 267 10.3.2...

Global site tag (gtag.js) - Google Analytics