2016-01-06 52 views
0

訪問TextBox.Text我有最初被設計爲具有不同的順序的功能的按鈕手動觸發一個winforms應用程序(4個按鈕沒有相應backgroundworkers,4個按鈕與對應backgroundworkers,8個按鈕總計)。每個按鈕都會同步進行一些快速設置,然後觸發後臺工作人員異步執行工作。這可能是繁重的工作。不能進行後臺工人

決定做出有,做了4個按鈕使用默認選項的全部工作的「快速」選項。不幸的是,我沒有把它設計成模塊化的,因爲我應該有。

我所做的是有ExpressButton稱之爲第五後臺工作,而這又對按順序每個按鈕調用InvokeOnClick。幸運的是,4個非異步按鈕點擊首先被調用。我正在使用AutoResetEvent在每個連續按鈕被點擊時阻止第五個背景工作。

下面是一些僞代碼,按鈕1-4不叫背景的工人,按鈕全局變量5-8呼叫backgroundworkers和_resetevent =新的AutoResetEvent(假):因此,這裏是

private void backgroundWorker5_DoWork(object sender, DoWorkEventArgs e)  
{ 
     ControlEventArgs automationcheck = new ControlEventArgs(expressButton); 

     InvokeOnClick(button1, null); 
     System.Threading.Thread.Sleep(500); 
     InvokeOnClick(button2, null); 
     System.Threading.Thread.Sleep(500); 
     InvokeOnClick(button3, null); 
     System.Threading.Thread.Sleep(500); 
     InvokeOnClick(button4, null); 
     System.Threading.Thread.Sleep(500); 
     InvokeOnClick(button5, automationcheck); 
     _resetevent.WaitOne(); 
     _resetevent.Reset(); 
     InvokeOnClick(button6, automationcheck); 
     _resetevent.WaitOne(); 
     _resetevent.Reset(); 
     InvokeOnClick(button7, automationcheck); 
     _resetevent.WaitOne(); 
     _resetevent.Reset(); 
     InvokeOnClick(button8, automationcheck); 
     _resetevent.WaitOne(); 
     _statusBox.AppendText("Finished" + Environment.NewLine); 
} 

奇怪的事情。在用戶界面我有2個文本框用戶輸入信息。

在backgroundworker1(上面button5對應),我可以訪問第一TextBox的。文本屬性。 但是在backgroundworker2(對應於button6)中,我無法訪問其他文本框的.Text屬性。 我可以直接在button6 click事件中訪問它,直到我調用RunWorkerAsync()。 只要我在backgroundworker2中試圖訪問TextBox.Text就會凍結程序。沒有例外,它只是停止。

這裏是我的理論: backgroundworker1被稱爲/沒有從button6點擊事件 參數運行通過傳遞一個鏈表類在RunWorkAsync參數從button5點擊事件 backgroundworker2被稱爲/運行(PARAMS [])我會使其不通過原始表單控件的某些上下文? 這裏有趣的是主窗體上還有一個名爲statusBox的文本框,我仍然可以在backgroundworker2中訪問它,事實上這正是我用於調試的目的。

所以回顧一下。

Button 9  
    Backgroundworker 5 
    Button 1 
    Button 2 
    Button 3 
    Button 4 
    Button 5 
     Backgroundworker 1 
     Can access TextBox.Text here 
    Button 6 
     Backgroundworker 2 
     Can't access TextBox.Text here 
    Button 7 
     Backgroundworker 3 
     unsure 
    Button 8 
     Backgroundworker 4 
     unsure 

最壞的情況:

由於button6仍然可以訪問文本框,我可以出去搶文本,並通過它在PARAMS列表的RunWorkerAsync。不過,我仍然想知道爲什麼1 backgroundworker可以在mainform上看到一個文本框,而另一個則不能。

+1

您應該使用委託並調用/調用requried ... –

+0

我應該做的事情有很多,但這個問題直接關係到爲什麼1個後臺工作者可以訪問一個文本框,另一個不能。 – SmashCode

+1

這個問題沒有意義。無論您是否可以從另一個線程訪問(有時)UI屬性都沒關係,因爲根據定義,行爲是** undefined **。 –

回答

2

按照Austin的說法和Invoke()調用所有的電話。

你打這個異常(我不在乎它是否一致)只是隨機,任何調用從工作線程UI可能會導致一個例外,因爲只有主線程必須訪問UI。

我敢打賭,當你訪問。文本屬性首次控制本身並不需要重新繪製,但第二次就需要,所以你將與一個跨線程異常結束。

+0

它最終變成了一個變體。細節很有趣,2個文本框是連接字符串,前2個按鈕嘗試自動檢測,第2個按鈕驗證。當所有這些都是一步一步完成時,每次驗證都需要檢查另一個盒子是否已經過驗證。如果是,則沒有任何操作,但是如果不是當前點擊需要在另一個框上設置ReadOnly = false。顯然,在調用這些命令時總是不會被驗證,所以其中一次點擊變成了ReadOnly = false。我認爲這導致了重繪的需要。 – SmashCode

+0

爲了解決這個問題,我意識到在驗證之後將連接字符串存儲在全局變量中,然後在每次需要連接字符串時引用TextBox的.Text屬性更有意義。似乎現在看起來很明顯,但我對整個UI很陌生,這是一個很大的錯誤,因爲我對線程基礎結構有了更好的理解(至少在winforms中) – SmashCode