相关疑难解决方法(0)

如何使用DoEvents()而不是"邪恶"?

简单的搜索DoEvents会带来很多结果,这些结果基本上会导致:

DoEvents是邪恶的.不要使用它.请改用线程.

一般引用的原因是:

  • 重新入侵问题
  • 表现不佳
  • 可用性问题(例如,在禁用的窗口上拖放)

但是一些值得注意的Win32功能,例如TrackPopupMenuDoDragDrop 执行自己的消息处理以保持UI响应,就像这样DoEvents.
然而,这些问题似乎都没有遇到过这些问题(性能,再入等等).

他们是如何做到的呢?他们如何避免引用的问题DoEvents?(或者他们?)

windows winapi doevents visual-c++ winforms

23
推荐指数
1
解决办法
8643
查看次数

为什么.NET不记录StackOverflow异常的堆栈跟踪?

如果我写这个:

class Program
{
    static void Main(string[] args)
    {
        throw new Exception("lol");
    }
}
Run Code Online (Sandbox Code Playgroud)

并从命令行运行exe,我在事件日志中得到两个条目.一个是应用程序错误,表示存在未处理的异常,另一个包含堆栈跟踪,源代码为.NET Runtime.

如果我写这个:

class Program
{
    static void Main(string[] args)
    {
        Recurse4Evr();
    }

    static void Recurse4Evr()
    {
        Recurse4Evr();
    }
}
Run Code Online (Sandbox Code Playgroud)

我只在事件日志中输入一个条目,它表示应用程序错误,并且存在堆栈溢出异常.堆栈跟踪没有第二个条目,所以它基本上没用.

为什么不记录堆栈跟踪?如果我设置DebugDiag并将其附加到我的进程然后存在堆栈溢出,则DebugDiag能够记录堆栈跟踪.显然,堆栈跟踪以某种方式可用于外部世界.如果运行时因为检测到堆栈溢出而终止进程,那么它也知道堆栈是什么.

在具有许多复杂交互的大型应用程序中,通常无法重新创建导致堆栈溢出的条件.在这种情况下,堆栈跟踪是弄清楚发生了什么的唯一方法.为什么微软决定记录这些信息并不重要?是否有合理的设计决策并不明显?

.net stack-overflow

6
推荐指数
1
解决办法
853
查看次数

标签 统计

.net ×1

doevents ×1

stack-overflow ×1

visual-c++ ×1

winapi ×1

windows ×1

winforms ×1