- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
您好,我正在使用 winform 并尝试使用 MessageBox 进行异常处理。奇怪的是,MessageBox 仅在主窗体(下面代码中的“Form1”)关闭后出现。
public class Worker {
/* edited (see below)
public void doWork() {
try {
// do something
client.Connect(serverAddress);
stream = client.GetStream();
}
catch(Exception e) {
MessageBox.Show(e.ToString(),
"This will not show up until Form1 is closed");
}
}
*/
}
public class Form1 {
/* edited (see below)
* public void threadProc() {
* Worker worker = new Worker();
* worker.doWork();
* }
*/
void button_Click(object sender, EventArgs e) {
// create a thread that will end up throwing an exception
Thread thread = new Thread(threadProc);
thread.Start();
}
}
使用 MessageBox 进行异常处理的更好方法是什么?
...所以我在 UI 线程中添加了一些用于 MessageBox-ing 的代码,但问题仍然存在。
public class WorkExceptionArgs : EventArgs {
public Exception e;
public WorkExceptionArgs (Exception e) { this.e = e; }
}
public partial class Worker1 { // renamed (Worker->Worker1)
/* (edited) Now Worker1 doesn't trigger any event (see below)
public event EventHandler<WorkExceptionArgs> workException;
*/
public void doWork() {
try {
// do something
client.Connect(serverAddress);
stream = client.GetStream();
}
catch(Exception e) {
/* (edited) suppose Worker1 never throws any exception (see below)
* // trigger event that will cause MessageBox-ing by UI thread
* workException(this, new WorkExceptionArgs(e));
*/
}
}
}
public partial class Form1 {
public void threadProc() {
Worker1 worker1 = new Worker();
/* (edited) Now Worker1 never throws any exception
* worker.workException += new EventHandler<WorkException>(worker_WorkException);
*/
worker1.doWork();
// (added) After doWork() is done, Form1 creates Worker2
Worker2 w2 = new Worker2(this, this.form2);
w2.workException += new EventHandlerArgs<WorkExceptionArgs>(form2.worker2_WorkException);
w2.doSomeOtherWork();
}
/* public void worker_WorkException(object sender, WorkExceptionArgs eArg) {
* MessageBox.Show(eArg.e.ToString(), "Still not showing");
* } */
Form2 form2 = new Form2(); // (added) At first form2 is hidden (see below)
}
实际上已经有另一种形式和另一种 worker 。一旦 Worker(Worker1) 连接到服务器,Form1 隐藏 (.Hide()),Form2 显示 (.Show()),Worker2 开始使用 Worker1 建立的连接。
public class Worker2 {
Worker2(Worker1 w1, Form2 frm2) { this.w1=w1; this.frm2=frm2; }
public Worker1 w1;
public Form2 frm2;
public event EventHandler<WorkExceptionArgs> workException;
public void doSomeOtherWork() { // do some other, using data in Worker 1.
try { // This will throw an exception
BinaryFormatter formatter = new BinaryFormatter();
MyObj mo = (MyObj)formatter.Deserialize(w1.getStream());
}
catch(Exception e) {
workException(this, new WorkExceptionArgs(e));
}
}
}
public class Form2 {
public Form2(Form1 frm1) { // to switch from frm1 to frm2
InitializeComponent();
this.frm1 = frm1;
}
public Frm1 frm1 {get;set;}
public void worker2_WorkException(object sender, WorkExceptionArgs ea) {
MessageBox.Show(this, ea.e.ToString(), "SHOWS ONLY IF FORM2 IS CLOSED");
}
}
public partial class Form1 {
delegate void switchWindow_Callback();
public void switchWindow() { this.Hide(); form2.Show(); }
public void switchWindowCb(object sender, EventArgs e) {
if(this.InvokeRequired) {
SwitchWindow_Callback hcb = new SwitchWindow_Callback(switchWindow);
this.Invoke(hcb, new object[] {});
}
else { this.switchWindow(); }
}
}
最佳答案
实际上,我敢打赌 MessageBox 出现在主窗体后面,只有在关闭它之前您才会看到它。
最好让 UI 线程(创建并拥有 Form1
的线程)执行 MessageBox-ing。您要么想要创建事件,要么在您的工作类中有一个错误回调委托(delegate)。
但是,BackgroundWorker
可能值得在这里检查,而不是尝试自己动手。假设这是一个致命异常,您可以保存和检索错误状态,并在线程结束时自动调用一个事件。
关于c# - 在多线程应用程序中使用 MessageBox 显示异常信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12347531/
我遇到了一个奇怪的问题。我正在 VC++ 2008 中制作 Win32 应用程序,制作一个类来封装大部分工作,以便在调用 MessageBox 时轻松重复。 .消息框已创建(我认为),但除非我按下 A
如果我的应用程序崩溃,我会使用 ExceptionFilter 来捕获崩溃,执行一些最终操作,然后向用户显示应用程序已崩溃的消息框。 因为应用程序已经崩溃,我能(或不敢)做的事情不多,因为如果我做的太
既然“messagebox”是“tkinter”包中的一个模块,为什么我必须使用 from tkinter import messagebox 代替 import tkinter.messagebox
出于某种原因,WPF MessageBox 看起来比 WindowsForms 中的更糟糕。 WPF 没有视觉样式。 如何将 Windows 样式应用于 WPF MessageBox? Windows
我无法找出两个消息框之间的主要区别。 System.Windows.MessageBox 和 System.Windows.Forms.MessageBox 有什么区别? 最佳答案 System.Wi
我通过将位图的构建操作设置为Splashscreen来使用WPF中的SplashScreen功能。在启动屏幕后面,正在检查许可信息,如果失败,我会显示一个 MessageBox。 根据这个Feedba
我正在使用http://dev.sencha.com/playpen/docs/output/Ext.MessageBox.html#prompt显示 extjs 提示,用户可以在其中输入一些文本,然
有了这个,默认就可以了。我可以设置默认取消吗? MessageBoxResult result = MessageBox.Show (message, caption, Messag
我正在将第三方基于 C 的 SDK 集成到我的 .NET 应用程序中。该应用程序将作为 Windows 服务在服务器上运行,因此它不应以任何方式与用户交互。 不幸的是,在某些错误情况下,它坚持调用 M
我有一个程序可以让用户在 2 个值之间进行选择。为此,我想打开一个带有 2 个按钮(确定、取消)和一个可供选择或写入值的字段的框。就像 QMessageBox 一样,可以填写/选择数据。我可以创建一个
如何将自定义按钮添加到 WPF 中现有的 MessageBox 中?除了通常的“确定”和“取消”按钮之外,我还需要添加 3 个按钮并处理它们的事件。 最佳答案 简短回答:不,这是不可能的,您需要编写一
我在 Windows 窗体上有几个组框,其中包含复选框、数字选择器和组合框。如果未选中该复选框,我希望禁用其他元素。我已经禁用了除加载复选框之外的所有内容,然后在 CheckedChanged 事件上
我有一个 c# 程序,正在尝试使用特定字符串(普通字符串,没什么特别的)调用 messageBox,并且当到达要与字符串连接的变量时,它显然会停止连接。代码: string first = userI
我一直认为 MessageBoxes 有点像断点——它们会阻止程序执行,直到用户单击“确定”。但是,我刚刚发现这是不准确的,我正试图弄清楚 MessageBoxes 何时会和不会停止执行。 通过 SO
我正在尝试显示一条简单的消息,我过去可能已经这样做过数千次,而现在……完整的文本字符串没有显示在 MessageBox 中。我没有做任何不同的事情,所以我没有看到问题。这是我的代码: if (Mess
我在使用模态消息框时遇到问题。 情况是这样的 用户从表单中选择 xx 出现消息框 用户打开嵌入式软件键盘(内置键盘,来自设备) 用户关闭键盘 MessageBox 失去焦点(怎么会?它应该是模态的!)
我正在使用 Kinect 开发一个使用 C# 和 WPF 的图像查看应用程序。当用户将双手放在头顶时,我会显示一个 Messagebox 询问用户是否真的想退出: //Quit if both
当我点击回车按钮时,显示MessageBox。当我像往常一样再次单击输入按钮时,我希望 MessageBox 关闭。问题是 - 它没有焦点,但 TextBox 有,当我单击输入按钮时 _textBox
我正在尝试找到一种从线程内部调用 MessageBox 的方法。但是我发现的每一段代码/示例都不起作用。有人可以用尽可能少的代码行以最简单、最简单的方式详细说明解决方案/示例吗? 到目前为止,这是我的
我在如下启动的 WPF 应用程序中有一个简单的消息框: private void Button_Click(object sender, RoutedEventArgs e) { Message
我是一名优秀的程序员,十分优秀!