![]() |
1
66
那么这个呢:
像这样使用:
|
![]() |
2
8
打电话
相反,您可以创建
|
![]() |
3
7
我一直在反复阅读关于添加逻辑检查的参数,以确定调用是否应该在不在UI线程上、也不在UI线程本身上时使用IFF。我写了一个检查执行时间的类(via 秒表 )对一种方法的效率进行粗略估计。 结果可能会让你们中的一些人感到惊讶(这些测试是通过 显示的窗体 事件):
结果如下:
我的结论是,无论您是在UI线程还是工作线程上,您都可以在任何时候安全地调用,而无需通过消息泵进行循环的大量开销。但是,在UI线程上执行大部分工作,而不是多次调用UI线程(通过 调用() )有利于大大提高效率。 |
![]() |
4
5
我意识到 one answer that's pretty much spot on ,但我想也发布我的看法(我也发布了 here ). 我的有点不同,因为它可以稍微更安全地处理空控件,并在必要时返回结果。当我试图调用在可能为空的父窗体上显示MessageBox并返回显示该MessageBox的对话框结果时,这两种方法都很有用。
用法:
|
![]() |
5
3
我不相信
在这种情况下,应考虑投票方法的原因是:
所以考虑创建一个
显然,这种方法消除了
|
![]() |
6
2
对于纯视图控件,我首选的方法是将所有控件状态封装在一个类中,该类可以在不经历任何不一致状态的情况下进行更新(一个简单的方法是将需要更新的所有内容放在一个不可变的类中,并在需要更新时创建类的新实例)。然后有一个方法联锁交换updateNeeded标志,如果没有挂起的更新,但IsHandleCreated为true,则开始调用更新过程。在进行任何更新之前,更新过程应首先清除updateNeeded标志(如果有人试图在此时更新控件,则将开始另一个请求)。注意,如果控件在准备更新时被释放,则必须准备捕获并吞咽异常(我认为是非法操作)。 顺便说一下,如果一个控件还没有连接到一个线程(通过添加到一个可见窗口,或者让它所在的窗口变得可见),直接更新它是合法的,但对它使用BeginInvoke或Invoke是不合法的。 |
|
7
1
我还不能发表评论,希望有人能看到这一点,并将其添加到接受的答案,否则是当场。
如书面所述,接受的答案不会编译,因为
另一件事是用法可能更清楚
|
![]() |
8
0
如果可能的话,使用BackgroudWorker更容易使UI响应,并使用ReportProgress更新UI,因为它运行在与UI相同的线程上,因此不需要InvokeRequired。 |