gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:26:26 25 4
gpt4 key购买 nike

我对为什么我的 VS2010 Windows 窗体应用程序被关闭感到困惑。

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

只要数据下载管理器中的状态变量发生变化,就会调用委托(delegate)。这按预期工作,例如当我设置数据下载时间时(数据下载管理器的状态为“已安排”)。当我的计时器关闭并运行我传递给委托(delegate)的方法时,它似乎在我逐步执行它时大部分时间都在工作(见下文,它在 UpdateFormData() 中正确设置了三个表单标签中的前两个标签),但是当它到达更改“lblDataDwnLoadManagerStatus”文本的行,没有错误,但它立即退出。

有一次我没有遇到错误,但在 Debug模式下出现了一条弹出消息,其中提到了一个我无法重新创建的跨线程异常。我希望这是清楚的。

任何帮助都会很棒。代码如下,顺便说一句,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);
}

关于c# - 为什么我的 Winforms 应用程序意外退出,但没有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8251142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com