我有一個ApplicationContext
與Form
。各種異步通信和定時線程可能有時需要重新啓動應用程序,但是在我可以重新啓動之前,我必須手動處理MyApplicationContext
,當新進程啓動時需要釋放將需要的資源立即。Form.Dispose()方法內的安全調用
在這種情況下,似乎只是撥打Application.Restart()
不會足夠快地處理資源。
在對MyApplicationContext.Dispose()
的調用中,隨後調用base.Dispose(disposing)
最終調用Form.Dispose()
方法,並且因爲這可能來自於各種線程,所以我看到發生了跨線程操作異常。
/// MyApplicationContext.requestRestart()
private void requestRestart()
{
this.Dispose(); // dispose of applicationcontext
Application.Restart();
}
導致...
/// MyApplicationContext.Dispose(bool)
protected override void Dispose(bool disposing)
{
/// dispose stuff
base.Dispose(disposing);
}
導致...
/// MainForm.Dispose(bool)
protected override void Dispose(bool disposing)
{
/// dispose stuff
base.Dispose(disposing);
}
可以從任何線程調用。
是否可以在Form
這樣的UI線程上重寫Invoke
覆蓋的配置處理程序?
protected override void Dispose(bool disposing)
{
if (this.InvokeRequired)
{
this.Invoke(new Action(() => Dispose(disposing)));
}
else
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
}
事實上,我是*隨着它離開了。我認爲將requestRestart方法移動到Form類是很容易的,例如,如果需要跨線程調用,它將在調用堆棧的底部完成。但在這種情況下,無法保證啓動重新啓動請求的線程將成爲「Form」UI線程 - 例如,網絡IO到達時。 – khargoosh
只要確保在實際_handling_重新啓動請求之前的清除操作之前確保已移至UI線程,就可以在任何地方啓動重新啓動請求。即使在那裏,你可能會發現使用'SynchronizationContext'而不是'Form'實例是有用/可取的,因爲大概'Form'實例將被作爲清理的一部分來處理(即你仍然有調用'在Invoke()方法返回之前將對象放在一個對象上調用()')。 –
我接受了您的好建議,並使用主窗體中的'SynchronizationContext'。謝謝彼得。我現在感覺好多了。 – khargoosh