我目前正在修复基于C#的远程访问工具(出于演示目的),并希望为MessageBox函数实现多线程。
我也有一点C#经验,所以吐出来有点尴尬。
此MessageBox生成代码的目标是.NET FW v4.6.1,它是标准的Windows应用程序,没有控制台窗口。我已经尝试(出于绝对笨拙)将Apartment类型设置为MTA。
using System.Threading;
var t = new Thread(() => MessageBox.Show(text, "placeholder",
MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly));
t.SetApartmentState(ApartmentState.STA);
t.Start();
连续运行时的预期输出是多个MessageBox,但是结果是只有一个MessageBox,而其他MessageBox仅在初始(和连续)框关闭时出现。
答案 0 :(得分:1)
我希望为MessageBox函数实现多线程。
不这样做。这是一个坏主意。用户界面控件应从专用的UI线程运行。
我也有一些C#经验
使用用户界面编写正确的多线程程序是专家级的任务;您应该首先获得更多的C#经验,或者雇用具有适当经验的人。
出于绝对的笨拙,我已经尝试将Apartment类型设置为MTA。
通过拼命尝试并查看有效方法进行编程不是编写正确的多线程程序的好技术。使用良好的工程实践:理解系统,并编写有意并正确地操纵系统的代码。充满信心地编程;如果您没有信心,请获得在解决简单问题之前的经验。
连续运行时的预期输出是多个MessageBox
您的期望与现实完全相反,这表明您对消息框的工作方式没有正确的观念。同样,在正确理解之前,请勿尝试解决此问题。
其他消息框仅在初始(和连续)框被关闭时出现
是的。如果您不了解模式控件和无模式控件之间的区别,请在继续编程用户界面之前先了解该区别。
在C#中显示MessageBox时,有没有一种方法可以正确实现多线程?
您不应尝试这样做。
听起来您想要多个无模式对话框。更好的解决方案是专门使用一个特定的线程来服务UI,并将所有无模式对话框放在该线程上。 从其他线程对这些控件的所有调用都必须编组到该公寓。