Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过线程访问控件_C#_Multithreading - Fatal编程技术网

C# 通过线程访问控件

C# 通过线程访问控件,c#,multithreading,C#,Multithreading,我使用c#中的WebBrowser控件来检查几个搜索引擎结果,但有时会无缘无故地卡住。我的第一个想法是将每个搜索函数作为一个线程,并从计时器中使用thread.abort(),但无论我做了什么尝试,我都无法处理UI控件(包括WebBrowser)。 有人能帮我解决吗?举一个例子会很好,因为我已经尝试了很多事情,并且不断遇到这些异常。我相信您可以在后台工作程序中使用WebRequest,避免处理COM线程模型的困难。您可以使用WebRequest.Timeout来处理任何您认为耗时过长的事情 试着

我使用c#中的WebBrowser控件来检查几个搜索引擎结果,但有时会无缘无故地卡住。我的第一个想法是将每个搜索函数作为一个线程,并从计时器中使用thread.abort(),但无论我做了什么尝试,我都无法处理UI控件(包括WebBrowser)。
有人能帮我解决吗?举一个例子会很好,因为我已经尝试了很多事情,并且不断遇到这些异常。

我相信您可以在后台工作程序中使用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.");
       }
   }
static void Main(字符串[]args)
{
BackgroundWorker bg=新的BackgroundWorker();
bg.dowwork+=后台工作人员;
bg.RunWorkerAsync(新列表{”http://download.thinkbroadband.com/512MB.zip" });
while(true){}
}
私有静态无效backgroundWorker_DoWork(对象发送方,DoWorkEventArgs e)
{
控制台写入线(“启动操作”);
BackgroundWorker bw=发送方作为BackgroundWorker;
List args=(List)e.参数;
变量url=(字符串)参数[0];
WebRequest=WebRequest.Create(url);
请求超时=300;
尝试
{
WebResponse=request.GetResponse();
控制台.WriteLine(“请求成功”);
}
捕获(例外情况除外)
{
WriteLine(“请求超时”);
}
}
WebBrowser是一个组件,当您想将IE实例嵌入到表示层时,应该使用它。除非需要,否则可以使用更轻的重量。

使用控件的.Invoke()方法:

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

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

你到底想在那些搜索引擎上查什么?你为什么要用网络浏览器?你不能使用HttpRequest吗?