为什么我的Winforms应用程序意外退出,但没有错误

本文关键字:有错误 退出 意外 我的 Winforms 应用程序 为什么 | 更新日期: 2023-09-27 18:15:39

我很困惑,为什么我的VS2010 Windows窗体应用程序被关闭。

它发生在我的主表单中。这个表单有一个运行良好的"数据下载管理器"类实例。在表单的代码中,我绑定了一个回调委托来更新表单上的数据,即显示dataddownloadmanager状态的标签。

每当Data Download Manager中的Status变量发生更改时,就调用该委托。这可以按预期工作,例如当我设置数据下载时间时(数据下载管理器的状态为"Scheduled")。当我的计时器关闭并运行我传递给代理的方法时,它似乎在我通过它的大部分方式工作(见下文,它正确地设置了UpdateFormData()中三个表单标签中的前两个),但是当它到达更改"lblDataDwnLoadManagerStatus"文本的行时,没有错误,但它立即退出。

在某一点上,我没有错误,但在调试模式下弹出消息,提到了一个交叉线程异常,我无法重新创建。我希望这是清楚的。

任何帮助都太好了。代码如下,顺便说一句,TradingAppDataRunManager从DataRunManager获得所有功能,包括如下。

public partial class frmTradingAppMain : Form
{
    private TradingAppDataRunManager drm;
    public frmTradingAppMain()
    {
        InitializeComponent();
    }
    private void frmTradingAppMain_Load(object sender, EventArgs e){}
    private void frmTradingAppMain_Shown(object sender, EventArgs e)
    {
        drm = new TradingAppDataRunManager();
        drm.StatusChanged += new DataRunManager.StatusChangeHandler(this.UpdateFormData);
        drm.InitializeOrScheduleDataRun();
    }
    private void UpdateFormData()
    {
        MessageBox.Show("This is a test");
        lblNextScheduledDataDownloadDate.Text = drm.DateTimeOfNextScheduledDataRun.ToShortDateString();
        lblNextScheduledDataDownloadTime.Text = drm.DateTimeOfNextScheduledDataRun.ToShortTimeString();
        lblDataDwnLoadManagerStatus.Text = Convert.ToString(drm.Status);
    }
    private void btnSetChangeOrCancelScheduledDataRunTime_Click(object sender, EventArgs e)
    {
        drm.InitializeOrScheduleDataRun();
    }
    private void btnExit_Click(object sender, EventArgs e)
    {
        Close();
    }
}
public abstract class DataRunManager
//The base class for the upper- level, overall management for an app's data downloading and processing.
{
    private List<DataCollection> dataCollectionList = new List<DataCollection>();
    private List<PerformanceTrackerPoint> performanceTrackerPoint;
    private List<Error> errorCollection;
    protected DataRunTimer timer;
    protected SqlConnection sqlConnection;
    public enum DRMStatus { Running, Scheduled, Inactive }
    public DRMStatus Status { get; set; }
    public DateTime DateTimeOfNextAvailableDataRun { get; set; }        //This is the time that is checked from the database.
    public DateTime DateTimeOfNextScheduledDataRun { get; set; }        //This is the time that gets set for the run.
    public delegate void StatusChangeHandler();
    public event StatusChangeHandler StatusChanged;
    protected abstract String SQLSelectStringForDateOfLastDataRun();
    protected abstract void SetDBConnection();
    protected abstract List<DataCollection> GetDataCollectionsFromSubclass();
    public void InitializeOrScheduleDataRun()
    {
        DateTimeOfNextAvailableDataRun = DateTimeOfNextDataRun();
        if (DataRunIsOverdue())
        {
            if (UserWouldLikeToPerformDataRun())
            {
                Status = DRMStatus.Running;
                RunMainDataProcedure(null);
            }
            else
            {
                ScheduleDataRun();
                Status = DRMStatus.Scheduled;
            }
        }
        StatusChanged();
    }

为什么我的Winforms应用程序意外退出,但没有错误

永远不要从创建控件的不同线程访问WinForms控件。

如果你的DataRunManager类正在使用一个单独的线程进行一些处理,然后该线程正在触发StatusChanged事件,那么事件处理程序正在一个不同的线程上处理,而不是创建你正在更新的WinForms标签。因此,按照以下行更改事件处理程序…

private void UpdateFormData() 
{ 
    this.Invoke(UpdateFormDataImpl);
}     
private void UpdateFormDataImpl() 
{ 
    lblDataDwnLoadManagerStatus.Text = Convert.ToString(drm.Status); 
} 

您可能需要处理AppDomain。UnhandledException事件

  AppDomain currentDomain = AppDomain.CurrentDomain;
  currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

与日志或其他在这里…

   static void MyHandler(object sender, UnhandledExceptionEventArgs args) {
      Exception e = (Exception) args.ExceptionObject;
      Console.WriteLine("MyHandler caught : " + e.Message);
   }

这将捕获所有一直冒泡到顶部并终止应用程序的异常。

在这里获取完整的Microsoft页面…http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx