c# - 我怎样才能让这个调用线程保存?
问题描述
我正在使用在此页面上找到的自定义消息框,包括来源: https ://www.c-sharpcorner.com/blogs/creating-customized-message-box-with-animation-effect-in-windows-form
在大多数情况下,它工作正常,但有时当我同时弹出 2 个消息框时,我会在此函数中崩溃:
class MsgBox : Form
{
private static MsgBox _msgBox;
public static MsgDlgResult Show(string message, string title, Buttons buttons, IconImage icon)
{
_msgBox = new MsgBox();
_msgBox._lblMessage.Text = message;
_msgBox._lblTitle.Text = title;
MsgBox.InitButtons(buttons);
MsgBox.InitIcon(icon);
_msgBox.Size = MsgBox.MessageSize(message);
_msgBox.ShowDialog();
MessageBeep(0);
return _buttonResult;
}
private static void ButtonClick(object sender, EventArgs e)
{
Button btn = (Button)sender;
switch (btn.Name)
{
case "Abort":
_buttonResult = MsgDlgResult.Abort;
break;
case "Retry":
_buttonResult = MsgDlgResult.Retry;
break;
......
}
----->>>> _msgBox.Dispose();
}
}
我收到错误消息 System.InvalidOperationException:“跨线程操作无效:从创建它的线程以外的线程访问的控件”
如何使此类线程安全或至少在 c# 中进行此调用?但是我必须仍然能够一次拥有多个消息框。
更新 我的电话:
MessageBoxResult result = MsgBox.Show("My Message test", string.Empty, MsgBox.Buttons.OK, MsgBox.IconImage.Error);
解决方案
让我猜猜...
- 您创建第一个对话框并将其分配给
_msgBox
变量。 - 然后创建第二个对话框并再次将其分配给同一个
_msgBox
变量(因为它是static
)。 - 您单击第一个对话框中的按钮
- 事件句柄触发并尝试处理第二个对话框
- 你得到了例外
此解决方案中的私有变量不应设为静态。如果它们是静态的 - 这个类的所有实例都引用变量的同一个实例,这里是相同的_msgBox
and _buttonResult
。
确保调用 static 时Show
调用的类有一个私有构造函数。在此构造函数中,您应该分配相应的值。
或者在声明变量时赋值。
推荐阅读
- php - wp_query 的条件 meta_query 和 tax_query
- wordpress - http 子页面未重定向到 https(安全)页面 - 如何修复?
- java - 给定一个字符串,确定字符串的排列是否可以形成回文
- javascript - 在 Shiny 中需要使用 updateRadioGroupButtons 动态更新下拉选项
- node.js - 在 Node.JS 中处理错误的正确方法是什么?
- android - Flutter:TextField 的提示文本未在屏幕 UI 中更新
- python-3.x - 无法在机器人框架表单 cmd 行中基于标记运行测试用例
- vue.js - vuetify快速拨号的位置问题
- r - 在R中按组将一列的元素组合成两列
- flutter - 根据内容调整容器的高度