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