小编Dal*_*tan的帖子

正确使用(或不使用)Dispatcher.CheckAccess()

在Winforms中,所有控件都有一个InvokeRequired属性,如果必须调用则返回true.[Begin]调用控件以修改它.

在WPF中,在DispatcherObject.CheckAccess()and中有一个看似相似的结构Dispatcher.CheckAccess(),但我对该EditorBrowsable(EditorBrowsableState.Never)属性感到害怕.当我禁用这样的编辑器浏览时,我用它来表示"你应该这样做.不,真的.如果需要解决你的问题,你就错误地设计了解决你的首要问题的解决方案." 另一方面,我发现的唯一替代方案(事实上,我的原始解决方案)是Thread.CurrentThread.ManagedThreadId == 1.(这太可怕了.它在通用情况下不起作用.我知道.但它确实适用于我的有限用途.)

MSDN 文档上的存在和推理背后沉默的EditorBrowsable属性.它确实意味着"不要使用它",因为如果我输入它,或者它有其他一些不那么禁止的含义吗?

c# wpf

14
推荐指数
1
解决办法
1万
查看次数

关闭.NET SerialPort后的ObjectDisposedExecption

我使用.NET 4 SerialPort对象与连接到COM1的设备进行通信.

当我完成设备后,我在SerialPort上调用Close.我不会调用Dispose,但我相信Close和Dispose在这里是同义词.

通常这很好用.

但是,有时我会在一段时间后得到以下异常(我看到的时间范围从5毫秒到175毫秒):

System.ObjectDisposedException: Safe handle has been closed
     at System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
     at System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)
     at Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(SafeFileHandle hFile, NativeOverlapped* lpOverlapped, Int32& lpNumberOfBytesTransferred, Boolean bWait)
     at System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
     at System.Threading.ThreadHelper.ThreadStart()

我的代码都没有在这个堆栈上.

我找到了http://blog.zachsaw.com/2010/07/serialport-ioexception-workaround-in-c.html,但那里的解决方案没有用.在进一步检查时,问题是IOException,而不是ObjectDisposedException.

关于拔掉USB转串口设备但是COM1在板载时观察到的问题有很多帖子,所以它并没有意外消失.

这里的问题也不是我的问题; SerialPort在其使用期间保持活动状态,并且仅在我与设备通话时才关闭.(一旦我完成,设备处于不会传输任何其他数据的状态.)

SLaks 建议在入口处设置一个断点SafeHandle.Dispose,以确定我何时处理我不应该做的事情,但是我会破坏该断点数十次.SerialPort.Close当我完成使用串行设备时,我的单次调用会调用三次,其余大约一半都在GC线程中.其余部分似乎与WPF UI元素相关.

我现在不知所措.我从哪里开始?

有没有办法确定哪个SafeHandle属于哪个对象,所以我可以肯定我没有意外地处理它?
除了Close之外还有一些咒语我需要正确关闭SerialPort吗?

.net c# serial-port .net-4.0 objectdisposedexception

10
推荐指数
1
解决办法
5838
查看次数

强制现有应用程序始终在启用UAC虚拟化的情况下运行

我见过几个与此相反的问题; "我如何禁用虚拟化?" 那不是我的问题.我想强制应用程序在启用虚拟化的情况下运行.

我有一个在Windows XP下运行得很好的应用程序,但是,因为它将其配置写入其工作目录("C:\ Program Files(x86)"的子文件夹),它在Windows 7下无法正常工作.如果我使用任务管理器打开UAC虚拟化,它保存其配置就好了,但当然它无法加载该配置.

我不想将其设置为以管理员身份运行,因为它不需要这些权限.我想将其设置为在启用UAC虚拟化的情况下运行.

发现了一个建议,我在注册表中添加了一些魔法HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags.为了完整性我也把它放进去Wow6432Node,但都没有任何效果.

uac

7
推荐指数
1
解决办法
2万
查看次数

标签 统计

c# ×2

.net ×1

.net-4.0 ×1

objectdisposedexception ×1

serial-port ×1

uac ×1

wpf ×1