2011-05-07 72 views
0

我正在嘗試編寫一個函數,該函數將動態創建選項卡頁,填充選項卡,然後返回有關所做的操作的數據。有些事件會告訴我每個選項卡何時完成,因此我將能夠分辨何時全部加載。讓C#函數在返回之前等待UI負載

所有的工作都是與UI相關的,我的理解是UI的東西必須在主線程中發生,所以聽起來像我不能只是創建一個線程來做到這一點,然後在我的函數中等待。我是否誤解了這個問題,UI用戶必須在主線程中?如何讓我的功能在不阻止UI中必須發生的工作的情況下等待?

編輯:爲了澄清,標籤頁有webbrowser控件將加載各種網頁,所以這些需要一些時間,我得到一個DocumentCompleted事件爲每個時它被加載。想法是這樣的:來電者給我一個網址列表。我彈出一個表單併爲每個網址創建一個包含網頁瀏覽器控件的標籤頁,並在每個標籤中加載一個網址。這些將在不同的時間完成,每個頁面加載後觸發DocumentComplete事件處理程序。當他們都加載完畢後,我想要將一個數據列表返回給原始調用者。

+0

如果您希望從後臺線程工作並修改UI控件而不像您在主線程中那樣,請查看我的答案。 – 2011-05-08 00:12:54

回答

1

...我的理解是,UI的東西在主線程中發生...

不,這並不一定真正。如果要修改,比方說,從後臺線程的標籤,你可以這樣做:

MethodInvoker m =() => { label1.Text = "Another text"; }; 
if (InvokeRequired) { 
    BeginInvoke(m); 
} 
else { 
    m.Invoke(); 
} 

代替:

label1.Text = "Another text"; 

如果您仔細,你不會有任何跨線程問題。

編輯:
如果要重構一點點的代碼看看我的問題Client Coding error for chatting application提供了答案。

編輯2:
根據您的編輯,這是我會怎麼做:

  1. 從用戶
  2. 啓動瀏覽器和一個變量,將持有多少收到的網址您打開的標籤。
  3. 開始,告訴應用程序處理的用戶進度或東西...
  4. 每當你收到一個DocumentComplete事件,您減少變量。
    如果變量的值爲0,則加載所有頁面。
  5. 停止進度條
  6. 將您想要的數據返回給用戶。

現在..你什麼時候需要使用Invoke每次你想從後臺線程訪問一些UI控件。在這種情況下,當您停止進度條時...

+0

但是我怎麼等待,直到UI的東西全部完成才返回給調用者?整個想法是,有人給我的URL列表,我建立這種形式並返回信息,一旦一切都加載。調用者是否需要創建一個線程並在那裏調用我的函數,這樣我就可以在不阻塞UI線程的情況下阻止我的代碼? – alanc10n 2011-05-08 00:18:20

+0

@idontwanttortfm我建議你開始一個進度條或者告訴用戶應用程序正在工作的東西。看看我在這裏提供的答案:http://stackoverflow.com/questions/5919964/how-best-execute-query-in-background-to-not-freeze-application-net/5920027#5920027我認爲這兩個問題是類似的。 – 2011-05-08 00:21:17

+0

雖然,調用者不是用戶。我很擔心收集這些信息並將其返回給調用者。我無法收集並返回,直到瀏覽器控件加載完他們的網頁內容。 – alanc10n 2011-05-08 00:32:44

0

我不確定我是否有正確的。無論如何,看看這個:

How to update the GUI from another thread in C#?

+0

想法是這樣的:來電者給我一個網址列表。我彈出一個表單併爲每個網址創建一個包含網頁瀏覽器控件的標籤頁,並在每個標籤中加載一個網址。這些將在不同的時間完成,每個頁面加載後觸發DocumentComplete事件處理程序。當他們都加載完畢後,我想要將一個數據列表返回給原始調用者。 – alanc10n 2011-05-08 00:09:28

相關問題