C# 嵌套调用中的WaitForm管理
我有一个wait表单C# 嵌套调用中的WaitForm管理,c#,winforms,C#,Winforms,我有一个wait表单FormWait(长时间运行的任务通知),它具有ShowMessage(stringmessage)功能 经常发生在代码中: public RootCall() { FormWait.ShowMessage("Begin long task 1..."); ChildCall(); FormWait.CloseForm(); } public ChildCall() { FormWait.ShowMessage("Begin long
FormWait
(长时间运行的任务通知),它具有ShowMessage(stringmessage)
功能
经常发生在代码中:
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
向用户显示消息,但在root级别关闭消息之前,还有另一个ShowMessage
子级和CloseForm
子级
我有几种解决方案:
System.Windows.Forms.Form
实例上运行。在每个ShowMessage
上都有一个递增的静态变量,在每个CloseForm上它递减。因此,通过查看该变量,我可以了解是否真的需要关闭表单(如果我是否在根级别),或者它只是一个嵌套的CloseForm
调用。在每个ShowMessage
上,新字符串刚刚更新到已经可见的表单上
ShowMessage
调用,创建表单的新实例,但这实际上是有线连接的。所以几乎可以肯定我不会选择这个解决方案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();
}
}
}
public分部类WaitForm:Form{
私人表格(){
初始化组件();
}
私有静态WaitForm实例;
私有静态堆栈消息=新堆栈();
公共静态void ShowMessage(字符串消息){
if(实例==null){
实例=新的WaitForm();
instance.FormClosed+=委托{instance=null;};
Show();
}
消息。推送(消息);
instance.lblMessage.Text=消息;
Update();
}
公共静态void CloseForm(){
messages.Pop();
if(实例!=null){
if(messages.Count==0)instance.Close();
else instance.lblMessage.Text=messages.Peek();
}
}
}
别忘了将CloseForm()调用放在finally块中,这样就可以防止异常。类似于“静态计数器”的东西,但更好。可能是我不会在close时调用Peek()最后一条消息(如果有),因为从UI的角度看,没有什么真正的意义,将之前出现的消息带回UI。嗯,更好地选择您的消息文本。不要写“开始foo”,而是写“在foo上工作”。这样,可见文本就可以准确地表示程序的状态。