訪問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上看到一個文本框,而另一個則不能。
您應該使用委託並調用/調用requried ... –
我應該做的事情有很多,但這個問題直接關係到爲什麼1個後臺工作者可以訪問一個文本框,另一個不能。 – SmashCode
這個問題沒有意義。無論您是否可以從另一個線程訪問(有時)UI屬性都沒關係,因爲根據定義,行爲是** undefined **。 –