我正在制作一个屏幕截图应用程序,一切都很顺利.我需要做的就是捕获活动窗口并截取此活动窗口的屏幕截图.有谁知道我怎么做到这一点?
如果我设置了多个事件处理程序,如下所示:
_webservice.RetrieveDataCompleted += ProcessData1;
_webservice.RetrieveDataCompleted += ProcessData2;
Run Code Online (Sandbox Code Playgroud)
事件RetrieveDataCompleted被触发时处理程序的运行顺序是什么?它们是否在同一个线程中运行并按顺序运行?
我想要阻止或处理我在写作中StackOverflowException对XslCompiledTransform.Transform方法的调用Xsl Editor.问题似乎是用户可以写一个Xsl script无限递归的东西,它只是在调用Transform方法时爆炸.(也就是说,问题不仅仅是典型的编程错误,这通常是造成这种异常的原因.)
有没有办法检测和/或限制允许的递归次数?或者任何其他想法,以防止这些代码炸毁我?
我们正在开发一个非常大的.NET WinForms复合应用程序 - 不是CAB,而是一个类似的本土框架.我们正在运行在Windows Server 2003上的Citrix和RDP环境中运行.
我们开始遇到随机和难以复制的"错误创建窗口句柄"错误,这似乎是我们的应用程序中的旧时尚句柄泄漏.我们正在大量使用第三方控件(Janus GridEX,Infralution VirtualTree和.NET Magic对接),我们根据数据库中的元数据进行了大量动态加载和内容呈现.
谷歌有很多关于这个错误的信息,但没有很多关于如何避免这方面问题的可靠指导.
stackoverflow社区是否对我构建易于操作的winforms应用程序有任何良好的指导?
假设按订阅顺序调用事件订阅者是否安全?
例:
void One(object sender, EventArgs e) {}
void Two(object sender, EventArgs e) {}
event EventHandler foo;
foo += One;
foo += Two;
Run Code Online (Sandbox Code Playgroud)
当事件被触发时,One()总是在Two()之前调用吗?
编辑:
你应该不依赖它,我只是想.这个想法是,多播代表与COMMAND模式类似.所以我只是想知道.通常你会使用一个保存COMMAND命令的集合,这样你就可以做undo/redo/whatever.
我一直在谷歌和stackoverflow搜索2小时.必须有一些我只是俯瞰.有没有一种简单的方法可以在消息框中选择文本?就在我现在调用MessageBox.Show()时,我无法复制显示的文本.为什么不?我如何设置文本可复制?
我的代码:
//catch all exceptions
catch (Exception ex)
{
MessageBox.Show(ex.Message);
//throw;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够选择出现的错误消息,以便用户将其发送给我,我可以解决他们的问题.任何帮助是极大的赞赏.
编辑:不能使用crtl-c方法.我的用户无法掌握这个概念.需要用鼠标突出显示并右键单击以选择选项.谢谢!
编辑:作为参考我最终做的是使用答案的混合.我创建了一个带有单个按钮的弹出窗口,并在按钮操作后复制到剪贴板.它不完美,但有正确的标签,它现在运作良好.谢谢大家的建议!
//catch all exceptions
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
MessageBoxButtons buttons = MessageBoxButtons.OK;
DialogResult result;
// Displays the MessageBox.
result = MessageBox.Show(ex.Message + "\n\nClick OK button to copy to clipboard", "Error", buttons);
if (result == System.Windows.Forms.DialogResult.OK)
{
Clipboard.SetText(ex.Message);
//throw;
}
}
Run Code Online (Sandbox Code Playgroud) .NET中有没有办法知道哪些参数及其值传递给方法.反思方式?这将在方法内部使用.它必须是通用的,因此可以从任何方法使用它.这是用于记录目的.
我们已经建立了一个巨大的winforms项目,已经进行了多年.
有时,我们的用户会得到一个看起来像这样的例外.
这个问题的解决方案似乎是:
不要从后台线程访问UI组件
.
但由于我们的项目是一个非常大的项目,有很多不同的线程,我们没有成功找到所有这些.
有没有办法检查(使用某些工具或调试选项)从后台线程调用哪些组件?
澄清:
我创建了一个带有单个的winforms项目示例Form,其中包含两个Button
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
button1.Text = "Clicked!";
}
private void button2_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
button2.BackColor = Color.Red; //this does not throw an exception
//button2.Text = "Clicked"; //this throws an exception when uncommented
});
}
}
Run Code Online (Sandbox Code Playgroud)
button2单击按钮时,背景颜色设置为红色.这发生在后台线程中(被认为是不良行为).但是,它不会(立即)抛出异常.我想用一种方法将其视为"不良行为".最好是通过扫描我的代码,但如果只能通过调试,(一旦从后台线程访问UI组件就暂停),它也没关系.
我一直在研究处理应用程序的所有异常的最佳方法,而不会弄乱代码.这里的主要目标是将有关异常的信息发送到外部平台,例如Application Insights.到目前为止,我发现了以下方法:
Castle Interceptor:
这是迄今为止最好的方法,就是要截获的方法要么是方法是虚拟的,要么是必须接口的类.由于我正在开发一个非常大的应用程序,因此不需要这些更改.
事件:
使用AppDomain还会考虑使用UnhandledException,但由于我有几个需要进行大量更改的应用程序域,因此仅针对异常来处理类,这不是最佳的,因为类不应仅仅因为异常处理而混乱.除了AppDomains的数量,我还有几个运行的线程,这种处理程序不会捕获异常.
PostSharp:
PostSharp与Castle的工作方式类似,如果我理解正确,这里的问题是我必须为我想截获的所有方法添加属性/装饰器,也不是一个非常好的方法.
如果有人对这里的最佳方法有任何建议,我将非常感激.
我在单独的线程中运行一些代码,这可能会引发异常(毕竟,代码倾向于这样做)。该线程将从主线程(GUI)派生,因此最终必须在此处理异常(例如,设置错误消息文本块)。我有两种解决方案,但都不允许在GUI线程中直接捕获异常。
注:我不能用这样的东西 Task 和 BackgroundWorker (至少不开箱),因为我需要能够改变 ApartmentState 线程的。
这是我想要的:
var thread = new Thread(() =>
{
// Code which can throw exceptions
});
try
{
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
MethodThatAwaitsThread(thread);
}
catch
{
// Exception handling in the GUI thread
}
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为异常永远不会离开线程。我知道它不能随时离开线程,但是我可以等待线程结束然后捕获它。
这是我当前的解决方案,它利用Dispatcher与GUI线程进行通信:
var thread = new Thread(() =>
{
try
{
// Code which can throw exceptions
Dispatcher.Invoke(UpdateGuiAsSuccess);
}
catch (Exception ex)
{
Dispatcher.Invoke(UpdateGuiAsError);
}
}
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是将Exceptionin 存储在对象中,然后在之后显式检查它。但这冒着人们忘记检查异常的风险:
Exception ex = null;
var thread = new Thread(() …Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×4
events ×2
winforms ×2
.net-2.0 ×1
asynchronous ×1
c#-2.0 ×1
devexpress ×1
handles ×1
messagebox ×1
noncopyable ×1
screenshot ×1
text ×1
wpf ×1