在保持一些代碼,我發現我們有一個後臺工作無限掛斷。工作人員需要訪問腳本文件。如果沒有定義腳本文件,則會編寫原始代碼以彈出文件對話框,以允許用戶選擇一個。它看起來是這樣的:文件對話框,從後臺工作
private void bgworker_DoWork(object sender, DoWorkEventArgs e)
{
... snip ...
if (String.IsNullOrWhitespace(scriptFile))
{
scriptFile = PromptForScript();
}
... snip ...
}
private string PrompForScript()
{
string script = "";
OpenFileDialog openDialog = new OpenFileDialog();
if (openDialog.ShowDialog() == DialogResult.OK)
{
script = openDialog.FileName;
}
return script;
}
我讀了一些關於MethodInvoker
,但幾乎所有的調用方法需要您從控制調用它們。有問題的後臺工作人員是從單獨的課程運行的,該課程不延伸Control
。我是否會使用bgworker爲此類調用該類的表單?或者是否有另一種中斷用戶輸入的線程?
FWIW - 一個設計考慮是檢查該文件是否存在等(隨後提示用戶)運行後臺工作之前,假設線程首先被拉開序幕通過用戶交互。我通常更喜歡在UI(表單)調用的上下文中保持「表單類型」調用(如打開對話框),使業務邏輯(運行腳本)保持獨立。 –
不是一個漂亮的解決方案,但是,我將調用回調到主UI線程,將文件名設置爲全局變量,然後從我的子類調用另一個檢索全局變量的方法。總之,1)要求後臺工作者; 2.)bgworker實例化子類的對象並調用啓動事件的類中的方法; 3.)主班正在收聽活動; 4.)在事件處理程序中,調用方法(包含InvokeRequired檢查); 5.)在GUI線程上從用戶獲取文件名; 6。)從子類中,調用另一個檢索文件名值的方法。 –