Управление WaitForm во вложенных вызовах - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть форма ожидания 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();   
}

FormWait в корне показывает сообщение пользователю, но до закрывает его на корневом уровне, есть еще ShowMessage ребенка и CloseForm ребенка.

У меня есть несколько решений, чтобы решить эту проблему:

  1. Как и в коде, при условии, что методы являются статическими и работают на одном статическом System.Windows.Forms.Form экземпляре.На каждом ShowMessage есть статическая переменная, которая увеличивает , а на каждом CloseForm уменьшает .Поэтому, посмотрев на эту переменную, я могу понять, действительно ли мне нужно закрыть форму (если я или нет на корневом уровне), или это просто вложенный вызов CloseForm.И для каждой ShowMessage новой строки, только что обновленной в уже видимой форме.

  2. Для каждого нового вызова ShowMessage создайте новый экземпляр формы, но это действительно нужно увидеть.Поэтому почти наверняка я не выберу это решение.

Любые идеи, как я могу управлять WaitForm (форма, которая сигнализирует пользователю о долгосрочных задачах) в случае вложенных вызовов, облегчая также жизнь разработчика .?

1 Ответ

1 голос
/ 29 ноября 2011

Класс 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();
        }
    }
}

Не забудьте поместить вызов CloseForm () в блок finally, так что все это безопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...