为什么我的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控件。
如果你的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