2010-04-11 67 views
3

我有一個C#中的多線程應用程序,它試圖寫入由另一個線程創建的Windows.Forms中的TextBox。需要InvokeRequired for Web.UI的幫助

由於線程無法修改它們未創建的內容,因此我使用InvokeRequired(如下面的代碼所示)來解決此問題。

public delegate void MessageDelegate(Communication message); 
void agent_MessageReceived(Communication message) 
{ 
    if (InvokeRequired) 
    { 
     BeginInvoke(new MessageDelegate(agent_MessageReceived), new object[] { message }); 
    } 
    else 
    { 
     TextBox1.Text += message.Body; 
    } 
} 

現在我需要在ASP.NET應用程序一個TextBox做同樣的,但顯然沒有InvokeRequired也沒有的BeginInvoke在Web.UI.的文本框存在 我能做什麼?

回答

0

如果你想做我認爲的事情,那麼這是不可能的。如果您的事件處理程序正在被服務器上的某個後臺進程調用,那麼您如何才能更新文本框?你會更新哪個文本框?您嘗試更新的文本框全部位於客戶端的Web瀏覽器上,而不是您的服務器上。

無論如何,您的問題的答案是沒有InvokeRequired或Invoke方法,因爲在ASP.NET中,控件無法跨線程訪問。只有當前處理Web請求的線程才能訪問正在服務的頁面的元素。

您需要重新考慮您的方法。您無法像使用桌面應用程序那樣真正在Web應用程序中執行任何操作。

+0

謝謝,這非常有幫助。我現在知道這種方法需要改變。你有什麼建議嗎? – Ali 2010-04-11 16:46:37

+0

對不起,延遲迴復。我沒有注意到你的評論。如果你有一個長時間運行的操作,一種可能的選擇是在ASP.NET中使用異步頁面處理。 http://msdn.microsoft.com/en-us/magazine/cc163725.aspx,或者你可以使用類似Ajax輪詢機制的東西。 – Josh 2010-04-17 13:25:41

2

我認爲你不需要這個在Web UI上。每個客戶端都會收到自己的TextBox,並且WebServer不會爲多個請求重複使用TextBox。我在這裏想念什麼?

+0

那麼你是說在Web.UI中,如果線程一個是文本框,線程二可以直接修改它? – Ali 2010-04-11 15:33:35

+0

不,我說的是,當您在Web上開發時,並不存在兩個線程同時修改同一個TextBox的情況。 – Ikaso 2010-04-11 15:35:34

+0

好吧,我明白你的意思了,但我想知道的是,首先在Web應用上,一個線程可以直接修改由另一個線程創建的控件,而不一定在同一時間,因爲這不能在Windows應用上完成,如果是,如何? – Ali 2010-04-11 15:40:15