嵌套调用中的WaitForm管理

时间:2011-11-29 08:49:43

标签: c# winforms

我有一个等待表单FormWait(长时间运行的任务通知),具有ShowMessage(string message)功能。

经常发生在代码中:

public RootCall() 
{
   FormWait.ShowMessage("Begin long task 1..."); 

   ChildCall();

   FormWait.CloseForm();   
}

public ChildCall() 
{
   FormWait.ShowMessage("Begin long task 2..."); 

   // some code here

   FormWait.CloseForm();   
}
root上的

FormWait向用户显示消息,但在根级别关闭它之前,还有另一个ShowMessage子级和CloseForm子级。

我有几个解决方案可以解决这个问题:

  1. 与提供的代码类似,这些方法是静态的,并在一个静态System.Windows.Forms.Form实例上运行。在每个ShowMessage上都有一个静态变量递增,在每个CloseForm递减。因此,通过查看该变量,我可以理解,如果我真的需要关闭表单(如果我是否在根级别),或者它只是一个嵌套的CloseForm调用。并且在已经可见的表单上更新的每个ShowMessage新字符串上。

  2. 对于每个新的ShowMessage调用,都要创建表单的新实例,但这确实是有线的。所以几乎可以肯定我不会选择这个解决方案。

  3. 任何想法,如何在嵌套调用的情况下管理WaitForm(向用户发出有关长时间运行任务的信号),使开发人员的生活更轻松。

1 个答案:

答案 0 :(得分:1)

Stack<> class很适合这个:

public partial class WaitForm : Form {
    private WaitForm() {
        InitializeComponent();
    }
    private static WaitForm instance;
    private static Stack<string> messages = new Stack<string>();

    public static void ShowMessage(string message) {
        if (instance == null) {
            instance = new WaitForm();
            instance.FormClosed += delegate { instance = null; };
            instance.Show();
        }
        messages.Push(message);
        instance.lblMessage.Text = message;
        instance.Update();
    }

    public static void CloseForm() {
        messages.Pop();
        if (instance != null) {
            if (messages.Count == 0) instance.Close();
            else instance.lblMessage.Text = messages.Peek();
        }
    }
}

不要忘记将CloseForm()调用放在finally块中,这样这都是异常安全的。