gpt4 book ai didi

c# - 单实例形式但不是单例

转载 作者:太空宇宙 更新时间:2023-11-03 20:47:18 24 4
gpt4 key购买 nike

我不明白这是怎么可能的。请帮忙!!

我有一个带有托盘图标的应用程序。我希望在用户双击托盘图标时显示一个表单。我有一个问题,可以通过快速三次或四次单击托盘图标来显示 2 个或更多表单。我不想要单例的原因是我希望每次关闭时释放表单以节省内存,也许这不是一个好主意?

我有一个名为 m_form1 的字段。我有一个名为 ShowForm1 的方法;我在双击 TrayIcon 时调用方法 ShowForm1。

        private Form1 m_form1;
private void ShowForm1()
{
if (m_form1 == null)
{
Trace.WriteLine("*CREATE*" + Thread.CurrentThread.ManagedThreadId.ToString());
m_form1 = new Form1();
m_form1.FormClosed += new FormClosedEventHandler(m_form1_FormClosed);
m_form1.Show();
}
m_form1.BringToFront();
m_form1.Activate();
}

所以当 Form1 需要一段时间来构建时,那么有可能创建 2,因为当第二次调用到达时 m_form1 仍然是 null。锁定似乎不起作用,因为它是两个调用的同一个线程(我猜是 UI 线程),即跟踪写出 *CREATE*1 两次(如下)。

[3560] *CREATE*1 
[3560] *CREATE*1

更改代码以包含锁定语句对我没有帮助。

    private Form1 m_form1;
private object m_Locker = new object();
private void ShowForm1()
{
lock (m_Locker)
{
if (m_form1 == null)
{
Trace.WriteLine("****CREATE****" + Thread.CurrentThread.ManagedThreadId.ToString());
m_form1 = new Form1();
m_form1.FormClosed += new FormClosedEventHandler(m_form1_FormClosed);
m_form1.Show();
}
}
m_form1.BringToFront();
m_form1.Activate();
}

我应该如何处理这种情况?

谢谢大家

蒂姆。

最佳答案

有一个额外的 bool 变量“m_formUnderConstruction”,您在构建表单之前对其进行测试,并在您决定构建它后立即设置它。

不幸的是,重入让这一切变得有点恶心。我已经删除了锁,就好像它曾经从不同的线程调用过一样,那么你就会遇到试图从不同的线程向构建它的线程显示表单的糟糕情况。

private Form1 m_form1;
private bool m_underConstruction = false;

private void ShowForm1()
{
if (m_underConstruction)
{
// We're about to show it anyway
return;
}
m_underConstruction = true;
try
{
if (m_form1 == null)
{
m_form1 = new Form1();
m_form1.FormClosed += new FormClosedEventHandler(m_form1_FormClosed);
m_form1.Show();
}
}
finally
{
m_underConstruction = false;
}
m_form1.BringToFront();
m_form1.Activate();
}

关于c# - 单实例形式但不是单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/270091/

24 4 0
文章推荐: iphone - 如何使用 iphone 在照片中找到矩形?
文章推荐: c# - 通过继承改变返回签名——多态
文章推荐: javascript - 仅在 CSS 中将颜色从 div 继承到另一个
文章推荐: html - 设置
标签的样式以显示为 appx 默认粗细(如果能够设置
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com