如何停止显示多个对话框?

Chr*_*sAU 5 .net vb.net winforms

我有一个非常讨厌的问题,我试图找到最简单的解决方案,但我似乎一直在使它变得复杂.

我的程序使用ShowDialog函数显示一个自定义对话框(我使用New构造函数创建此表单),但是当我的程序在对话框中等待输入时,我的程序继续运行其他代码,(我假设从其他消息启动) ,但我仍然无法找到关于此的好信息,所以除了这个主题之外,任何人都有关于此的参考),并且到达同一点,在该点显示对话框并显示它.所以我最终得到了大量的对话框.

我的目标是防止过多的对话框.如果程序到达此对话框启动点,我希望它等待/暂停,直到第一个对话框完成.

我考虑过线程解决方案,后台工作者,各种想法,但它们似乎使事情变得复杂,我实际上并没有修复它.

有谁知道如何防止这种情况发生?

非常感谢您的帮助.谢谢

Abe*_*bel 1

在我看来,你的代码中有一些非常丑陋的错误!我首先会专注于修复这个错误。执行此操作的简单方法是在打开对话框的行上设置断点。当第二次点击该行时(第一个对话框仍然打开时),查看该点的堆栈跟踪并检查所有活动线程(“查看线程”和“查看堆栈”窗口)以找出问题的原因。

此外,更改代码以打开模式对话框窗口,其中父窗口必须是所有者。模式对话框窗口将停止执行并阻止父窗口处理用户输入(这可能导致此行为)。

编辑

从您的评论中,我了解到您有多个无法控制的线程,并且您希望一次有一个线程访问消息框代码。使用线程时,有多种可用的同步原语。扩展它们中的每一个都需要一本书(您可以尝试《Windows 上的并发编程》,这本书很详尽,但该书在结构上有一些缺陷),知道适合您的一本书需要了解您的代码。

也就是说,您可能希望使用互斥体执行类似以下操作,这至少可以防止其他线程访问代码(意味着:它将把它们置于挂起状态,直到互斥体被释放)。如果您想防止弹出框显示多次,请添加一个静态布尔标志变量(或在弹出表单上添加一个复选框“仅显示一次框”)。互斥加标志一并解决了两个问题:只有一个线程会运行该代码,并且该代码永远只会运行一次。

// as static class variable, create a mutex
private static Mutex dialogMutex = new Mutex();

// a static flag preventing the dialog box to show more than once
// (you may wish to resolve this differently, depending on req's)
private static boolean dialogIsShownOnce = false;

public static void ShowDialogBox()
{
    // Wait until it is safe to enter, this makes the current thread 
    // the exclusive user of this code and other threads may only enter
    // after the current thread finishes.
    dialogMutex.WaitOne();

    // depending on your requirements, you may not want this
    // must come _after_ WaitOne to prevent entering before another
    // thread that entered hasn't yet changed this variable
    if(dialogIsShownOnce)
       return;


    // show your dialog box as a modal box 
    // if you are unsure: add a breakpoint just after the ShowDialog 
    // it should only be hit _after_ you dismiss the dialog box
    yourForm.ShowDialog();

    // set the flag, or the counter, or whatever you wish:
    dialogIsShownOnce = true;

    // Release the Mutex, this will remove the "roadblock" and allow
    // other threads to enter this piece of code
    dialogMutex.ReleaseMutex();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码未经测试,应被视为如何解决此问题的提示。解决这个问题的方法有很多,但我想上面的方法可能正是你所需要的。