C sharp写一个线程安全的MessageBox
时间: 2024-05-03 18:21:40 浏览: 10
由于MessageBox是Windows Forms应用程序中的一部分,因此需要使用Windows Forms的线程安全技术来实现线程安全的MessageBox。以下是一个示例代码:
```csharp
using System;
using System.Threading;
using System.Windows.Forms;
namespace ThreadSafeMessageBox
{
public static class MessageBoxHelper
{
private static readonly object _lock = new object();
public static DialogResult Show(string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
{
DialogResult result = DialogResult.None;
if (Application.OpenForms.Count > 0)
{
Form activeForm = Application.OpenForms[0];
if (activeForm.InvokeRequired)
{
activeForm.Invoke(new Action(() =>
{
lock (_lock)
{
result = MessageBox.Show(activeForm, message, caption, buttons, icon);
}
}));
}
else
{
lock (_lock)
{
result = MessageBox.Show(activeForm, message, caption, buttons, icon);
}
}
}
return result;
}
}
}
```
这里使用了一个名为MessageBoxHelper的静态类来实现线程安全的MessageBox。其中,_lock是一个对象锁,用于保证在多线程环境下MessageBox的安全性。
Show方法接受与MessageBox.Show方法相同的参数,并返回DialogResult类型的结果。在Show方法中,首先检查当前应用程序是否有打开的窗体。如果有,则获取第一个窗体并检查它是否需要调用Invoke方法来跨线程调用。如果需要,则使用Invoke方法执行一个Lambda表达式来调用MessageBox.Show方法,并在Lambda表达式中使用_lock对象锁来保护MessageBox的安全。如果不需要调用Invoke方法,则直接使用_lock对象锁来调用MessageBox.Show方法。
这个MessageBoxHelper类可以在任何多线程应用程序中使用,以确保在多个线程同时调用MessageBox时不会出现问题。使用方法与普通的MessageBox.Show方法相同,只需要调用MessageBoxHelper.Show方法即可。