我有一些代碼如下。這是在「線程2」C#捕獲在另一個線程上調用委託異常
WebBrowser browser = this.webBrowser
browser.Invoke(new MethodInvoker(delegate { browser.Document.GetElementById("somebutton").InvokeMember("click"); }));
Thread.Sleep(500);
browser.Invoke(new MethodInvoker(delegate { browser.Document.GetElementById("username").SetAttribute("value", username); }));
//folowed by several more similar statments
運行的本質,我就調用在不同的線程創建的WebBrowser控件,「線程1」的一些方法。
如果在瀏覽器中加載的當前頁面上的元素不包含元素「somebtn」或「username」,則會從「線程1」拋出異常。
有沒有辦法在「線程2」上捕獲該異常?我知道我可以在委託中使用try catch,並且有一個特殊的委託來返回一些值(比如異常),但是有沒有辦法繞過這個選項?
注意*:我需要Thread.Sleep,因爲特定頁面在特定事件之間需要一些延遲。如果有一些方法可以將這些事件組合到一個委託中(同時保留某種形式的非阻塞延遲),我認爲這可以工作,我只是將它們全部包裝在單個try catch中,並創建一個返回異常的委託。
如果我走在'WebBrowser'類在MSDN看看(http://msdn.microsoft.com/en-us/library/cc491073.aspx)我沒有看到任何'Invoke'方法。你在使用哪一個? – 2013-05-13 08:25:59
Invoke是所有UI控件的一種方法...它允許從其他線程等更新控件。 – user871289 2013-05-13 08:40:12
如果您的假設爲真,並且您調用了Control.Invoke,則所有委託都將在UI線程上調用。所以...在同一個線程上。那是你要的嗎? – 2013-05-13 08:42:35