我正在使用后台工作程序来读取数千个文件并搜索特定文本的应用程序。它基本上是找出哪些帐户是帐户组的一部分,因此我通过后台工作程序中的循环搜索整个组目录。
我有委托子设置来更新标签文本并将项目添加到列表框,它似乎已经解决了我对非法线程的任何问题。但是,我没有找到有关阅读列表框的具体细节,例如。因此,举例来说,如果我在某个群组中找到该帐户但该群组已添加到我的列表框中,我就不想再次添加它,否则它将会重复。
我的程序工作正常 - 但是从我所读的线程开始并不总是立即引发错误。我试图避免滚动我的应用程序并偶尔出现错误。所以我的问题是:我是否需要代表来阅读列表框?
答案 0 :(得分:0)
就像一个小术语一样:代表只是指向其他方法的指针,并且根本不提供任何线程安全性。你正在做的是在UI线程上调用调用方法(或者只是调用)。
回答您的问题:从后台线程访问UI元素时,最佳做法是 始终 调用。永远不应该从后台线程访问UI元素(控件),因为用户界面无法处理跨线程调用,因为并发的可能性很大(也就是说,当两个线程试图同时访问同一个控件时)时间)。
当.NET运行时检测到来自另一个线程的控件的调用时,不会在其上创建控件时抛出InvalidOperationException
。它这样做是为了防止您做一些可能会破坏应用程序的事情。这种检测工作相当不错, 但不完美 。
在某些情况下,运行时没有检测到您正在执行非法的跨线程调用,在这种情况下,它不会抛出异常。您的应用程序仍然有效,但这并不能排除仍存在并发问题的事实。
例如,如果您要从UI线程中添加或删除ListBox
中的项目,同时在后台线程的列表框项目上运行一个繁重的循环,那么这将导致您的应用程序打破,循环很可能会抛出异常。
总结一下:您可以访问某些控件属性,而.NET运行时不会抛出InvalidOperationException
,但如果该属性影响控件的行为/外观/内容然后最好的做法是始终调用以避免任何并发问题。