通过线程访问控件

时间:2011-04-29 16:50:37

标签: c# multithreading

我在c#中使用WebBrowser Control来检查几个搜索引擎的结果,但有时候它无缘无故地被卡住了。我的第一个想法是将每个搜索功能作为一个线程并使用来自计时器的thread.abort()但我无法处理UI控件(包括WebBrowser),无论我尝试过什么。 任何人都有我的解决方案?一个例子是伟大的,因为我已经尝试了很多东西,我不断得到所有这些例外。

2 个答案:

答案 0 :(得分:1)

我相信你可以在后台工作者中使用WebRequest&避免处理COM线程模型的困难。您可以使用WebRequest.Timeout来处理您认为花费太长时间的任何事情。

尝试这样的事情:

   static void Main(string[] args)
   {
       BackgroundWorker bg = new BackgroundWorker();
       bg.DoWork += backgroundWorker_DoWork;

       bg.RunWorkerAsync(new List<object> { "http://download.thinkbroadband.com/512MB.zip" });
       while (true) {}
   }

   private static void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
   {
       Console.WriteLine("Starting operation.");
       BackgroundWorker bw = sender as BackgroundWorker;

       List<object> args = (List<object>)e.Argument;

       var url = (string)args[0];
       WebRequest request = WebRequest.Create(url);
       request.Timeout = 300;

       try
       {
           WebResponse response = request.GetResponse();
           Console.WriteLine("Request successful.");
       }
       catch (Exception ex)
       {
           Console.WriteLine("Request timed out.");
       }
   }

WebBrowser是您希望将IE实例嵌入表示层时应使用的组件。除非你需要这个,否则你可以使用更轻量级的东西。

答案 1 :(得分:0)

使用控件的.Invoke()方法:http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

您还可以使用其他方法:.BeginInvoke和.EndInvoke用于异步调用。

if(control.InvokeRequired)
{
    control.Invoke(control.delegate);
}