내 VS2010 Windows Forms 응용 프로그램이 종료되는 이유에 대해 신비가 있습니다.내 Winforms 앱이 예기치 않게 종료되지만 오류가없는 이유는 무엇입니까?
내 기본 형태로 발생합니다. 이 양식에는 충분히 잘 실행되는 "데이터 다운로드 관리자"클래스의 인스턴스가 있습니다. 양식의 코드에서 양식의 데이터를 업데이트하는 콜백 대리자, DataDownloadManager의 상태를 표시하는 레이블을 연결합니다.
데이터 다운로드 관리자의 상태 변수가 변경 될 때마다 대리인이 호출됩니다. 데이터 다운로드 시간을 설정할 때 (데이터 다운로드 관리자의 상태가 "예약 됨"과 같이) 예상대로 작동합니다. 내 타이머가 작동을 멈추고 델리게이트에 전달 된 메서드를 실행하면, 단계를 거치면서 대부분의 방식대로 작동하는 것으로 보입니다 (아래 참조, 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();
}
중 하나는 출력 창을 확인하거나 모든 예외의보고 가능 - 스튜디오는 기본적으로 많은 예외에 대해 알려하지 않습니다 시각을. 디버그 -> 예외로 이동 한 다음 공용 언어 런타임 예외에 대해 클릭 한 다음 확인을 클릭합니다. 코드를 다시 실행하여 예외가 발생하는지 확인하십시오. –