Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套调用中的WaitForm管理_C#_Winforms - Fatal编程技术网

C# 嵌套调用中的WaitForm管理

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

我有一个wait表单
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
    调用,创建表单的新实例,但这实际上是有线连接的。所以几乎可以肯定我不会选择这个解决方案

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

    Stack类自然适合这种情况:

    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上工作”。这样,可见文本就可以准确地表示程序的状态。