Mic*_*Sim 20 .net c# vb.net multithreading
今天我不得不修复一些使用线程的旧VB.NET 1.0代码.问题是从工作线程而不是UI线程更新UI元素.我花了一些时间才发现我可以使用InvokeRequired的断言来查找问题.
除了上面提到的并发修改问题,还有可能遇到的死锁,竞争条件等.由于调试/修复线程问题很痛苦,我想知道如何减少这个领域的编码错误/错误以及如何更容易地找到它们.所以,我要求的是:
如果适用且可能,请提供一些示例代码.答案应该与.NET框架(任何版本)相关.
Jon*_*eet 25
这可能是一个庞大的列表 - 阅读Joe Duffy的优秀" Windows上的并发编程 "以获取更多细节.这几乎是一个大脑转储......
在调试方面,我没有太多建议.使用Thread.Sleep来提高看到竞争条件和死锁的可能性是可行的,但是在你知道把它放到哪里之前你必须对错误有一个合理的理解.记录非常方便,但不要忘记代码进入某种量子状态 - 通过记录来观察它几乎必然会改变它的行为!
Jul*_*iet 11
我不确定这对你正在使用的特定应用程序有多大帮助,但是这里有两种从编写多线程代码的函数式编程中借用的方法:
不可变的物体
如果需要在线程之间共享状态,则状态应该是不可变的.如果一个线程需要对对象进行更改,它会使用更改创建对象的全新版本,而不是改变对象的状态.
不可变性本身并不限制您可以编写的代码类型,也不会低效.有许多不可变堆栈的实现,构成映射和集合基础的各种不可变树,以及其他类型的不可变数据结构,并且许多(如果不是全部)不可变数据结构与它们的可变对应物一样有效.
由于对象是不可变的,因此一个线程不可能在您的鼻子下改变共享状态.这意味着您不需要获取锁来编写多线程代码.这种方法消除了与死锁,活锁和竞争条件相关的一整类错误.
Erlang风格的消息传递
您不需要学习该语言,但请查看Erlang以了解它如何实现并发.Erlang应用程序可以无限扩展,因为每个进程都与其他进程完全分离(注意:这些不完全是进程,但也不完全是线程).
进程启动并简单地旋转循环等待消息:消息以元组的形式接收,然后进程可以模式匹配以查看消息是否有意义.进程可以发送其他消息,但它们对接收消息的人无动于衷.
这种风格的优点是消除锁定,当一个进程失败时它不会导致整个应用程序崩溃.以下是Erlang风格并发的一个很好的总结:http://www.defmacro.org/ramblings/concurrency.html
| 归档时间: |
|
| 查看次数: |
4729 次 |
| 最近记录: |