バックグラウンドワーカーを含む単一のフォームを含むWinFormsアプリケーションがあります。このフォームには、RunWorkerAsync()を使用してバックグラウンドワーカーを開始するボタンと、アプリケーションを終了する別のボタンが含まれています。背景労働者が作業を完了した後、私はこのような例外を除いて終了]ボタンをクリックした後、約1/3の時間、アプリケーションがクラッシュします:ここでは未処理のSystem.NullReferenceExceptionで終了すると.NET WinFormsアプリがクラッシュする
System.NullReferenceException was unhandled
Message=Object reference not set to an instance of an object.
Source=System.Drawing
StackTrace:
at System.Drawing.Graphics.Dispose(Boolean disposing)
at System.Drawing.Graphics.Finalize()
ボタンのイベントハンドラであること私たちがここを見ているコードパスがちょうど閉じる()の呼び出しである私が先に言ったように、バックグラウンドワーカーがまだ実行されている間、私はアプリケーションを終了していないよ
private void buttonExit_Click(object sender, EventArgs e)
{
if (!buttonStartWorker.Enabled)
{
DialogResult dr = MessageBox.Show("Background worker is still running! Exit anyway?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dr == DialogResult.OK)
{
backgroundWorker.CancelAsync();
Close();
}
}
else
{
Close();
}
}
:アプリケーションを終了します。また、私のUSB関連のハンドルでメソッドをcloseおよびdisposeするFormClosingイベントハンドラもあります。そのコードは以下の通りである:いつかwriteHandle.Dispose()とアプリケーションが実際に終了した時間の間に、この例外が発生している
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
// close and dispose all open handles to the USB device
if (hidHandle != null)
{
if (!(hidHandle.IsInvalid))
{
hidHandle.Close();
hidHandle.Dispose();
}
}
if (readHandle != null)
{
if (!(readHandle.IsInvalid))
{
readHandle.Close();
readHandle.Dispose();
}
}
if (writeHandle != null)
{
if (!(writeHandle.IsInvalid))
{
writeHandle.Close();
writeHandle.Dispose(); // unhandled exception seems to occur after this
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
}
。私を最も混乱させるのは、私のコードがSystem.Drawingを明示的に使用していないので、これを追跡するのに問題があります。何が価値がある、私の背景労働者は、以下のんのために
:
- それはいくつかのデータを読み取りおよび書き込みに/ USBデバイスから
- それは
- それをいくつかのデータをダウンロードするWebクライアントを作成しますいくつかのSOAP呼び出しを行います
アプリケーション(System.Draを明示的に使用していないときに、System.Drawingで処理されていないNullReferenceExceptionが発生する可能性があることについて、翼)は出る?
完全なスタックトレースを投稿してください。 – wal