Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 窗体关闭时需要新线程吗?_C#_.net_Winforms_Events - Fatal编程技术网

C# 窗体关闭时需要新线程吗?

C# 窗体关闭时需要新线程吗?,c#,.net,winforms,events,C#,.net,Winforms,Events,我有一个按钮点击事件处理程序,上面写着 在FormClosing事件中,我检测到未保存的更改并说是否要保存 如果他们说是,我设置e.Cancel=true,然后调用我的Save方法。如果数据在我的保存方法中保存的很好,我会这样说。关闭,但表单保持打开状态 这似乎是个很简单的主意,但我想不出来 我需要在FormClosing中创建新线程吗?如果他们说是,则设置e.Cancel=true并创建一个新线程来执行保存,然后调用this.Close 如果他们说是,我设置e.Cancel=true,然后调用

我有一个按钮点击事件处理程序,上面写着

在FormClosing事件中,我检测到未保存的更改并说是否要保存

如果他们说是,我设置e.Cancel=true,然后调用我的Save方法。如果数据在我的保存方法中保存的很好,我会这样说。关闭,但表单保持打开状态

这似乎是个很简单的主意,但我想不出来

我需要在FormClosing中创建新线程吗?如果他们说是,则设置e.Cancel=true并创建一个新线程来执行保存,然后调用this.Close

如果他们说是,我设置e.Cancel=true,然后调用我的Save方法。如果数据在我的保存方法中保存的很好,我会这样说。关闭,但表单保持打开状态

改变这个

提示用户 如果他们说是,设置e。取消=!拯救 如果他们说不,则设置e.Cancel=true
这将使表单关闭,除非他们在提示时说“否”,或者保存例程失败。不需要新的线程或线程,只需在逻辑上稍作更改。

听起来您想要做的不是将e.Cancel设置为true,而是从FormClosing有条件地调用Save。只有在保存失败时才能取消。例如:

private void OnFormClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
   if ( IsDataModified() )  // check if the data is unsaved...however you do so
   {
      // display a message asking the user to save changes or abort.
      if(MessageBox.Show("Do you want to save your changes?", 
                         "My Application", 
                         MessageBoxButtons.YesNo) ==  DialogResult.Yes)
      {
          if( !SaveChanges(); )
              e.Cancel = true; // save did not succeed!
      }
   }
}

求你了,为了对所有神圣事物的爱,不要叫这个。从形体的关闭事件中关闭。另请参阅:无限递归。目前Save方法不返回布尔值,因此我需要这样做。谢谢,您提到保存可能会失败-如果保存失败,只需设置e.Cancel==true即可。但是,将Save返回值设为布尔值会使这变得简单。目前Save方法不返回布尔值,因此我需要这样做。Thanks@Jon:根据可能导致保存成功/失败的条件,您可能还需要在OnFormClosing中的调用周围添加try/catch。我不会使用异常作为流量控制的一种手段,但在用户退出时,让应用程序因未处理的异常而崩溃是不可取的。