我已经搜索了几个小时,但迄今为止没有找到任何解决方案 - 所以想发帖求助。
我有一个用vb.net编写的WPF应用程序,在DotNet 4.0上运行,启动工作线程执行特定的功能,如哈希文件和其他处理器/时间密集型例程。
一些启动的线程需要模拟不同的用户,以便访问网络资源,而登录用户通常无法直接访问这些资源(他们可以通过应用程序控制访问网络资源,但不能通过Windows资源管理器等方式访问)。为此,工作线程会模拟预先确定的具有访问权限的用户帐户,然后允许应用程序访问网络资源。
在以模拟的用户帐户运行的工作线程正在工作时,它偶尔需要更新位于用户目录中的本地sql 3.5紧凑型数据库。该数据库仅适用于登录用户 - 而不是模拟的用户。
为了允许此更新,从模拟的工作线程中,我可以访问UI Dispatcher对象(在创建线程时传递),并调用子例程来更新SQL紧凑型数据库。
这里有一个有趣的问题,我无法解释,但请继续阅读,因为可能有人能够解释这个问题。
当应用程序从工作线程调用UI Dispatcher时,它会返回到登录用户的凭据,以在UI线程中更新sql数据库 - 然后当UIThread.dispatcher.invoke调用返回到工作线程时,它会回到模拟的工作线程帐户。
今天-我不知道为什么-当我调用UI dispatcher线程来更新SQL Compact数据库时,线程上下文保留在模拟的用户身份下 - 而不是UI线程上的登录用户。就像模拟的用户现在强制适用于所有线程 - 包括UI线程一样。
我试图理解的是什么是正确的结果 - UIThread.Dispatcher.Invoke是否应该在UI线程(未模拟)的用户上下文中执行调用的任何代码,还是由于从工作线程启动了调用,所以模拟用户上下文对UI线程上的调用回调产生影响?
我感到困惑,因为昨天 - 当我在UIThread.Dispatcher.Invoked例程中设置断点时,我可以看到线程正在以登录用户的帐户下执行,并且对SQL紧凑型数据库的更新有效。然而,今天同样的代码正在以模拟的帐户下执行,并且在尝试更新数据库时出现访问被拒绝的异常。
我在启动工作线程之前检查了UI线程的ManagedThreadId,并确认在执行UIThread.Dispatcher.Invoke时,ManagedThreadId返回到UI线程的ManagedThreadId - 然后当调用结束并且执行返回到工作线程时,ManagedThreadId返回到正确的工作线程ManagedThreadId。这次没有改变的是该线程的用户。它似乎现在一直保持在模拟的用户上,除非我明确结束线程的模拟。
我有一个用vb.net编写的WPF应用程序,在DotNet 4.0上运行,启动工作线程执行特定的功能,如哈希文件和其他处理器/时间密集型例程。
一些启动的线程需要模拟不同的用户,以便访问网络资源,而登录用户通常无法直接访问这些资源(他们可以通过应用程序控制访问网络资源,但不能通过Windows资源管理器等方式访问)。为此,工作线程会模拟预先确定的具有访问权限的用户帐户,然后允许应用程序访问网络资源。
在以模拟的用户帐户运行的工作线程正在工作时,它偶尔需要更新位于用户目录中的本地sql 3.5紧凑型数据库。该数据库仅适用于登录用户 - 而不是模拟的用户。
为了允许此更新,从模拟的工作线程中,我可以访问UI Dispatcher对象(在创建线程时传递),并调用子例程来更新SQL紧凑型数据库。
这里有一个有趣的问题,我无法解释,但请继续阅读,因为可能有人能够解释这个问题。
当应用程序从工作线程调用UI Dispatcher时,它会返回到登录用户的凭据,以在UI线程中更新sql数据库 - 然后当UIThread.dispatcher.invoke调用返回到工作线程时,它会回到模拟的工作线程帐户。
今天-我不知道为什么-当我调用UI dispatcher线程来更新SQL Compact数据库时,线程上下文保留在模拟的用户身份下 - 而不是UI线程上的登录用户。就像模拟的用户现在强制适用于所有线程 - 包括UI线程一样。
我试图理解的是什么是正确的结果 - UIThread.Dispatcher.Invoke是否应该在UI线程(未模拟)的用户上下文中执行调用的任何代码,还是由于从工作线程启动了调用,所以模拟用户上下文对UI线程上的调用回调产生影响?
我感到困惑,因为昨天 - 当我在UIThread.Dispatcher.Invoked例程中设置断点时,我可以看到线程正在以登录用户的帐户下执行,并且对SQL紧凑型数据库的更新有效。然而,今天同样的代码正在以模拟的帐户下执行,并且在尝试更新数据库时出现访问被拒绝的异常。
我在启动工作线程之前检查了UI线程的ManagedThreadId,并确认在执行UIThread.Dispatcher.Invoke时,ManagedThreadId返回到UI线程的ManagedThreadId - 然后当调用结束并且执行返回到工作线程时,ManagedThreadId返回到正确的工作线程ManagedThreadId。这次没有改变的是该线程的用户。它似乎现在一直保持在模拟的用户上,除非我明确结束线程的模拟。
请问有人能够解释一下这个问题吗?并建议我是否在错误的方向上努力,应该尝试其他方法。我真正想了解的是为什么它之前一直可以工作,现在却不能工作了 - 没有任何代码更改。
抱歉发了这么长的帖子。
谢谢。
Rod.