2

如标题所示,如何让我的程序等待完成然后单击关闭按钮后退出。

我必须确保一些重要的任务已经完成,这样我才能让程序退出。但我不知道该怎么做。

我试图创建一个这样的标志:

public partial class MainForm : Form
    {
        public bool closeable = true;
        public MainForm()
        {
            InitializeComponent();
        }
         public setCloseable()
         {
             this.closeable = false;
         }
    }

在另一个线程中,当我的程序正在做一些非常重要的事情时,我在任务完成后将“可关闭”设置为假,将可关闭设置为真;当使用单击关闭按钮时,我使用以下代码:

private void MainForm_closing(object sender, FormClosingEventArgs e)
    {
        if (this.closeable == true)
        {
            Application.Exit();
        }
    }

这不起作用,因为如果使用单击关闭时该值不正确,则程序将不会关闭。

这种方式对吗?我应该如何改进它或任何建议?

4

4 回答 4

1

您可以使用取消属性。将其设置为true将取消表单的关闭。

bool hasUserClickedClose = false;
private void MainForm_closing(object sender, FormClosingEventArgs e)
{
    if (!this.closeable)
    {
        e.Cancel = true; 
        hasUserClickedClose = true;
    }
}

然后在您的其他方法完成其任务之后。

if(hasUserClickedClose)
{
   this.closeable = true;
   Application.Exit();
}
于 2013-07-28T13:57:02.243 回答
0

保持代码原样,但您必须在关闭处理程序中分配FormClosingEventArgs.CanceltoTrue以避免程序在不应该关闭时关闭。

您应该Timer在关闭处理程序中添加一个,仅当您正在运行任务并且尚未启动时才会启动。该计时器每秒或五秒或您认为合适的任何时间运行一次。计时器的工作是检查您的任务是否已完成,如果完成,它将设置您的closeable字段为 true 并Close在您的程序中触发事件。

然后,您的FormClosing事件将触发,看到closeableTrue,然后它不会设置FormClosingEventArgs.Cancel为 true 并允许程序退出。

Timer timer1 = null;
public MainForm()
{
    InitializeComponent();

    timer1 = new Timer();
    timer1.Interval = (int)new TimeSpan(0, 0, 4).TotalMilliseconds;
    timer1.Tick += (s, ev) => { timer1.Stop();  closeable = IsTaskDone(); Close(); };
}

public bool closeable = true;
public void setCloseable()
{
    this.closeable = false;
}

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.closeable == true)
    {
        Application.Exit();
    }
    else
    {
        timer1.Start();

        e.Cancel = true;
    }
}

private bool IsTaskDone()
{
    // TODO: returns true if the task is completed
}
于 2013-07-28T14:04:27.020 回答
0

KeyboardP的方式是正确的,我觉得也是最简单的。但是,我怀疑你期待更聪明的东西。

您可以创建一个特殊的单例类。而不是在 MainForm 中使用“可关闭”标志,只需放置一个整数类型的“importantTasksCount”。

每次重要任务开始时,您都应该增加该计数器,并在任务终止时减少它。

单例模式简化了从任何地方对控制器实例的访问。

现在,这是诀窍:

// Winforms/WPF version
public sealed class CloseManager
{
  private CloseManager(){}
  private static CloseManager _instance;
  public static CloseManager Instance
  {
    get 
    { 
      if (_instance == null) _instance = new CloseManager();
      return _instance;
    }
  }


  private static bool closeable;
  private static int importantTasksCount;

  public static void CloseRequest()
  {
    this.closeable = true;
  }

  public static void IncImportantTask()
  {
    this.importantTasksCount++;
  }

  public static void DecImportantTask()
  {
    this.importantTasksCount--;
    if (this.closeable) Application.Exit();
  }

}
于 2013-07-28T14:10:48.257 回答
0

您可以在importantTaskTask 上完成繁重的工作,但从用户的角度来看,这样做有点难看。根据您所说的,这应该可行:

public partial class MainForm : Form
 {
    public MainForm()
    {
        InitializeComponent();
        this.importantTask= Task.Factory.StartNew(()=>{/*do your work*/});
    }
    private Task importantTask;

    private async void MainForm_closing(object sender, FormClosingEventArgs e)
    {
         await importantTask;
    }
}
于 2013-07-28T14:11:21.833 回答