我有一个等待表单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
子级。
我有几个解决方案可以解决这个问题:
与提供的代码类似,这些方法是静态的,并在一个静态System.Windows.Forms.Form
实例上运行。在每个ShowMessage
上都有一个静态变量递增,在每个CloseForm
上递减。因此,通过查看该变量,我可以理解,如果我真的需要关闭表单(如果我是否在根级别),或者它只是一个嵌套的CloseForm
调用。并且在已经可见的表单上更新的每个ShowMessage
新字符串上。
对于每个新的ShowMessage
调用,都要创建表单的新实例,但这确实是有线的。所以几乎可以肯定我不会选择这个解决方案。
任何想法,如何在嵌套调用的情况下管理WaitForm(向用户发出有关长时间运行任务的信号),使开发人员的生活更轻松。
答案 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块中,这样这都是异常安全的。