首页 > 编程知识 正文

c代表什么,b级车

时间:2023-05-03 23:01:04 阅读:10928 作者:1163

在. NET Framework框架的WinForm中构建GUI程序接口时,如果尝试使用控件的事件响应函数更改控件的状态,例如,一个按钮的文本原本称为“打开”

voidbuttononclick (对象发送器,事件e ) )。

{

button.Text='关闭';

}

如果以类似的写法运行程序,可能会发生异常。 异常消息通常是“无法从创建该控件的线程中调用它”。 请注意,这里是“可能的”,并不一定会引起这个异常。 导致这种异常的原因是控件是在主线程上创建的。 (例如this.Controls.Add )…; 在中,进入控件的事件响应函数时,它是控件所在的线程,而不是主线程。 如果在控件的事件响应函数中更改控件的状态,则主课程和线程可能会发生冲突。 如果主线程正在重新绘制控件的外观,则在另一个线程中更改控件的外观会导致屏幕混乱。 但是,这种情况并不总是发生,如果主线程此时重新绘制另一个控件,就有可能逃脱。 这样的写法可以正常通过,没有触发异常。

正确的写法是在控件响应函数中调用控件的Invoke方法。 (其实,如果大家以前也使用过C Builder,就会找到像Invoke这样的激活主线程的函数。 Invoke方法沿着控件树向上搜索,直到找到创建控件的线程(通常是主线程),然后进入该线程以更改控件的外观,从而避免发生线程冲突。 正确写法的例子如下。

voidbuttononclick (对象发送器,事件e ) )。

{

button.invoke (新事件发生器) delegate

{

button.Text='关闭';

();

}

必须在Invoke方法中创建委托。 可以写下函数及其相应的请求。 但是,如果希望在调用Invoke方法时直观地显示特定函数,而不是在其他地方搜索,则上述示例代码非常适用。

这样的写法有麻烦的地方。 根据控件的不同,写法也不同。 对于TextBox,则需要TextBoxObject.Invoke;对于Label,则需要LabelObject.Invoke。 有稍微统一的写法吗?

主窗口类本身也有Invoke方法。 如果不希望控件改变书写方式,可以使用this.Invoke :

voidbuttononclick (对象发送器,事件e ) )。

{

this.invoke (新事件发生器) delegate

{

button.Text='关闭';

();

}

在C# 3.0及更高版本中有Lamda表达式,这样的匿名请求可以写得更简洁。 NET Framework 3.5及更高版本提供了操作软件包方法。 例如,下面的写法看起来非常简洁。

voidbuttononclick (对象发送器,事件e ) )。

{

this.invoke(newaction () )=

{

button.Text='关闭';

();

}

以上写法往往充斥着用WinForm构建的程序。

微软新一代接口开发技术WPF将接口呈现和业务逻辑原始分为两个线程,因此控件的事件响应函数不需要Invoke。 但是,如果手动打开新线程,则需要Invoke才能在该新线程上更改控件的外观。

自转: 3358 blog.Sina.com.cn/s/blog _ 82dd 53120100 virn.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。