在模拟用户下运行的非UI线程是否会自动模拟UI线程?
|
我已经搜寻了几个小时,到目前为止还算没有运气-所以以为我会发布。
我有一个用vb.net编写的WPF应用程序,它在DotNet 4.0上运行,该应用程序启动工作线程来执行特定功能,例如哈希文件和其他处理器/时间密集型例程。
启动的某些线程需要模拟其他用户才能访问登录用户通常无法直接访问的网络资源(允许通过应用程序(例如,通过Windows资源管理器)来控制对网络资源的访问) 。为此,工作线程模拟了一个具有访问权限的预定用户帐户,该帐户随后允许应用程序访问网络资源。
当在模拟用户帐户下运行的此工作线程正在工作时-有时需要更新位于Users目录中的本地sql 3.5 Compact数据库。仅登录用户(而非模拟用户)可以访问该数据库。
为了允许此更新,我可以从模拟的工作线程访问UI Dispatcher对象(创建线程时通过该对象),在其中调用一个子例程来更新SQL Compact数据库。
这是一个有趣的问题,我无法解释,但请继续阅读,因为有人可能会对此进行解释。
当应用程序从工作线程调用UI Dispatcher时,该应用程序将退回到登录的用户凭据,以升级UI线程中的sql数据库-然后,当UIthread.dispatcher.invoke调用返回到工作线程时,它将是回到模拟的工作线程帐户。
今天-我没有理由-当我调用UI调度程序线程来更新SQL Compact数据库时,线程上下文保留在模拟用户下-而不是UI线程上的登录用户。就像模拟用户现在被强加到所有线程(包括UI线程)上。
我想了解的是正确的结果是什么-UIThread.Dispatcher.Invoke应该执行在UI线程的用户上下文(未模拟)下调用的任何代码,或者非压缩的用户上下文对invoke调用生效回到UI线程,因为它是从工作线程启动的?
我感到困惑是因为昨天-当我在UIThread.Dispatcher.Invoked例程中有一个断点时,我看到该线程正在登录的用户帐户下执行,并且SQL Compact数据库的更新正常工作。但是今天,在模拟帐户下正在执行相同的代码,并且在尝试更新数据库时出现访问被拒绝的异常。
我在启动工作程序线程之前检查了UI线程的ManagedThreadId,并能够确认执行UIThread.Dispatcher.Invoke时,ManagedThreadId返回到UI线程的ManagedThreadId,然后在调用结束时又返回执行程序给工作程序线程将ManagedThreadId返回到正确的工作程序ManagedThreadId。这次没有改变的是该线程的用户。除非我明确结束线程的模拟,否则现在似乎始终保留在模拟用户上。
有人可以说明一下吗?建议我是否做错了所有事情,应该尝试以其他方式做这件事。我真正想了解的是它为什么一直在起作用-为什么现在却不起作用-而且从昨天到今天之间没有代码对此代码进行更改。
抱歉,很长的帖子
干杯
竿。
没有找到相关结果
已邀请:
1 个回复
嗓瑰