肯定有一种方便的方法:
我已经在我的主窗体上实现了鼠标拖动行为的"移动窗口",
我希望鼠标单击/移动事件被表单拦截,而不是由其中的控件拦截.
我想找到一个等效/复制鼠标事件的"KeyPreview"属性
此外,我想避免在12个控件的鼠标事件中单独将鼠标事件重定向到主窗体方法12次(这是我到目前为止找到的丑陋的解决方法)
有任何想法吗 ?
情况
好吧,正如你在下面看到的,我有一个主应用程序,创建一个线程,创建一堆后台工作者.当一些BG工作人员触发RunWorkerCompleted时,我有时最终会丢弃一个未处理的异常,(因为我明确指出了这一点,但这不是问题).
因此,Logs清楚地显示我的UnhandledException处理程序已输入并报告该异常.我知道我故意滥用OnUnhandledException,方法是使用Console.Read()停止App退出.我是故意这样做的,因为我想在终止应用程序之前进行人工干预/检查.
public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Logger.log("UNHANDLED EXCEPTION : " + e.ExceptionObject.ToString());
Mail.Sendmail("ADMIN ALERT : " + e.ExceptionObject.ToString());
Console.Read(); // Yes, this is an ungraceful trick, I confess.
}
Run Code Online (Sandbox Code Playgroud)
然而,在手动退出之前,假设只是一个"暂停",结果是让应用程序保持活跃状态,即,线程仍在生成工作程序,并且运行就像没有发生任何事情一样.甚至Weirder:UnhandledException仍然会在它再次发生时不时被删除.并且它每次记录,表现得就像是一个普通的'尝试捕获.(这是.Net 3.0之前的默认行为)
问题
那么,为什么一切都会发生,好像没有抛出UnhandledException,并且线程和BG一直在运行,好像什么也没发生?我的猜测是,只要OnUnhandledException处理程序没有完成,并且App仍处于活动状态,所有仍处于活动状态的正在运行的线程将继续生活在一个自由的世界中并完成自己的工作.
这给了我一个糟糕的诱惑,就是保持这个设计,作为一个尝试/捕获到unHandled Exception.
我知道这不是一个整洁的想法,因为你永远不知道异常是否严重或可以跳过的东西.但是,我真的更喜欢我的程序一整天都在运行并观察日志报告/邮件警报,并自行决定是否需要重新启动.由于这是一个需要全天候运行的服务器应用程序,因此我希望避免因轻微的仍然未处理的异常导致的错误和重复中断.最大的优点是服务器程序在我们逐个跟踪未处理的异常时保持运行,并在它们发生时提供补丁来处理它们.
感谢您的耐心等待,请随时提供反馈.
PS:不,我没有抽烟.
有没有什么聪明的方法可以避免在以一般方式调用事件之前测试事件的无效性?很明显,如果我调用一个委托,我希望它被分配.
(如果我真的想要/需要测试它的无效性,我最终可以明确地做到这一点,但系统地进行这种测试有点单调乏味.)
public delegate void ResetTradesDelegate();
public ResetTradesDelegate ResetTradesEvents;
public void OnSessionRxAdmMessage(IVfxFixAppSession session, FixMessage msg)
{
if (ResetTradesEvent != null) //<-- Is there "any" a way not to write this test explicitly for each delegate ?
ResetTradesEvent();
}
Run Code Online (Sandbox Code Playgroud) 作为每个人,我习惯于在逐步模式下调试VS中的代码.好吧,既然我到处都有很多背景工作者的申请,我不再在堪萨斯州了.
调试线程应用程序的最有效方法是什么,并能够监视每个线程以跟踪代码中发生的情况?
截至目前,我坚持使用单独的记录器实例为每个线程进行调试,但这慢慢变成了一场噩梦,我很快就会淹没在我自己的日志中.
问题:在应用程序生命周期内创建所有对象的出生/死亡/内存使用情况的最佳方法是什么?(图形报告会更好)
为什么会出现这样一个问题:
在其他许多问题中,其背后的想法是揭示可能永远不会被垃圾收集器收集的长寿命对象或导致内存故障(例如堆/堆栈问题等),并提供有价值的信息.有效地管理对象生命周期
(我实际上只花了一整夜调试一个多线程应用程序,最后注意到"相信被处置/更新"的对象实际上仍然活着并粉碎了服务器内存.)
VS2010性能向导和Profiler可能是一个很好的入门者......我偶然发现了一些以编程方式执行此操作的方法,但它涉及单独包装对象(艰苦而不是代码无缝)
我正在寻找看起来像这样的东西:
Application START[-----------------------------------------------------------]END
Object 1 [---------------------------]
Object 2 [---------------------------]
Object 3 [-----------------------------------------------------]
Run Code Online (Sandbox Code Playgroud) 编辑1
我根本不排除这可能是由使用Profiler的一些非常基本的副作用引起的(我的"常规"项目中的一些错误设置)
我想在我的应用程序中改进计算时间,所以我决定进行彻底的分析分析.所以我刚刚启动了.Net内存分配配置文件来分析我的应用程序.
我完全惊呆了,看着计算速度提高了20倍!
应用程序包括从带有BackgroundWorkers的二进制文件读取数据,处理它们,
并将结果存储到MSSQL DB中.每轮通常需要20秒,而分析它几乎需要1秒.我检查并确保两种情况下结果一致.
一个.Net实验的朋友告诉我,探查器优化了线程并"以某种方式"找到了通过线程锁和瓶颈的方式,但我简直不敢相信.
所以我的问题是:
编辑2
我知道这听起来很疯狂,令人难以置信.我自己仍然非常怀疑.但它是真的.
在分析器运行时,SAME代码运行得非常快.我使用SAME测试数据,并观察SAME计算输出.我无法给出一个简单的复制项目,因为它是一个相对较大的框架.我正在使用Visual Studio 2010 Profiler.
我将尽可能多地提供关于流程的详细信息,并且一旦发现它就会发布一条线索.
定期运行日志:
03/23/2011 18:04:34 | 180434.621 | 模拟集[5] - [1] - [5 PC-1 0 [SET 1/48]
03/23/2011 18:05:01 | 180501.271 | 处理时间:00:00:26.6515244
等
Profiler运行LOGS:
03/24/2011 11:38:15 | 113815.592 | 模拟集[5] - [1] - [5 PC-1 0 [SET 1/48]
03/24/2011 11:38:17 | 113817.350 | 处理时间:00:00:01.7581005
等
编辑3:线索
确定好的我的坏(我在编辑1上警告这种可能性,因为这太令人难以置信了.抱歉)@Watts建议检查我是否处于调试或发布模式.我已经做过了.但@SnowBear指出有两个不同的东西:运行调试版软件和在调试器下运行软件我确保在Build and Execution中的活动配置是RELEASE是VS2010.但是,由于我刚刚疯狂,我决定直接从bin/release中的exe文件启动应用程序.而且......过程每个过程需要1秒钟.运行Profiler会使您退出调试模式(无论您处于发布模式还是调试模式),这让我感到困惑.
感谢All Case Closed.
我正在开发一个高性能应用程序,导致主进程看似停止响应和崩溃 - 不时 - 由于过载(我得到关闭应用程序对话框,所以应用程序永远不会退出本身,只是冻结,这很烦人)
我欢迎任何干净的方式来临时检测应用程序冻结,所以我可以使用BAT(或其他)自动杀死进程和重新启动.
当然,这是审核App时的临时修复,但同时也非常方便.
TieBreaker: BTW,有没有办法覆盖Windows的异常屏幕,只是退出应用程序??? 这大部分时间都是烦人的功能.
编辑:
在上帝的份:应用IS再用冷冻,虽然每一个任务BG工人线程运行!我在评论中指明了这一点.来吧,我不是那么傻.只是你的应用程序运行BG工作人员并不意味着它永远不会冻结!正如我所说,请务必回答我的问题,我不是在寻找有关如何设计我的应用程序的课程,我已经在努力了,我知道必须做些什么.正如多次指定的那样,我在此期间只需要修复服务器.谢谢.
我正在调试/监视一个日志文件,其中包含大量的控制字符[SOH]
这使得日志几乎不可读(对我来说,在NP ++上,但是必须这样,因为这个字符在我正在监视的协议中有一些用处) )
如何在NP ++上以更友好的方式显示该角色?
编辑:替换不是一个选项,因为我只想拖尾文件,而不是编辑它.
I have skimmed through the PyPy implementation details and went through the source code as well, but PyPy's execution path is still not totally clear to me.
Sometimes Bytecode is produced, sometimes it is skipped for immediate machine-code compiling (interpreter level/app level code), But I can't figure out when and where exactly is the machine code produced, to be handed to the OS for binary execution through low-level instructions (RAM/CPU).
I managed to get that straight in the case of …
我试图直接从控制台应用程序实例化一个窗体.
出于一些奇怪的原因,当我调用Form1.Show()
新创建的Form时,不会绘制所有控件和冻结(HourGlass图标).但是,当我调用ShowDialog()时,一切都很顺利,除了我需要回到控制台,但我不能,所以它不是一个选项...
我该怎么做才能使我的表格显示正确?我在这里错过了什么吗?
OrderControlForm OrderControlBox = new OrderControlForm();
OrderControlBox.BuyEvent += new OrderControl.BuyDelegate(doBuy);
OrderControlBox.SellEvent += new OrderControl.SellDelegate(doSell);
OrderControlBox.Show();
Run Code Online (Sandbox Code Playgroud)
调用上述代码以响应Console用户输入的命令.
编辑: 这是工作代码:
Thread mThread = new Thread(delegate()
{
StratControlBox = new StratControl(StratIDs);
StratControlBox.ShowDialog();
});
mThread.SetApartmentState(ApartmentState.STA);
mThread.Start();
Run Code Online (Sandbox Code Playgroud)
我仍然不明白为什么我不得不打电话ShowDialog()
而不是Show()
.
当我使用后者时,Form在涂漆后立即"消失".