c# – 线程导致GUI冻结
所以我不是最熟悉C#编程语言的人,不过我已经在这里和那里做了一些测试应用程序.
我注意到我为正在处理的应用程序创建的线程越多,我的GUI就越开始冻结.我不确定为什么会发生这种情况,我以前认为多线程应用程序的一部分原因是为了避免GUI冻结. 一个解释将不胜感激. 另外,这是我用来创建线程的代码: private void runThreads(int amount,ThreadStart address) { for (int i = 0; i < amount; i++) { threadAmount += 1; Thread currentThread = new Thread(address); currentThread.Start(); } } 这是线程运行的内容: private void checkProxies() { while (started) { try { WebRequest request = WebRequest.Create("http://google.co.nz/"); request.Timeout = (int)timeoutCounter.Value * 1000; request.Proxy = new WebProxy(proxies[proxyIndex]); Thread.SetData(Thread.GetNamedDataSlot("currentProxy"),proxies[proxyIndex]); if (proxyIndex != proxies.Length) { proxyIndex += 1; } else { started = false; } request.GetResponse(); workingProxies += 1; } catch (WebException) { deadProxies += 1; } lock ("threadAmount") { if (threadAmount > proxies.Length - proxyIndex) { threadAmount -= 1; break; } } } } 解决方法
虽然我无法告诉你为什么你的代码正在减慢GUI的速度,但是你的代码中应该做一些事情来使它更好地全面.如果问题仍然存在,那么找出问题要容易得多.
>创建Thread对象很昂贵.这就是为什么在C#中添加新类以更好地处理多线程的原因.现在您可以访问Task类或Parallel类(如下所述). 因此,快速回顾 – 使用Parallel类进行多线程,并使用并发类来保持适当的位置. 这是我写的一个简单例子: private ConcurrentDictionary<string,bool?> values = new ConcurrentDictionary<string,bool?>(); private async void Button_Click(object sender,RoutedEventArgs e) { var result = await CheckProxies(); label.Content = result.ToString(); } async Task<int> CheckProxies() { //I don't actually HAVE a list of proxies,so I make up some data for (int i = 0; i < 1000; i++) values[Guid.NewGuid().ToString()] = null; await Task.Factory.StartNew(() => Parallel.ForEach(values,new ParallelOptions() { MaxDegreeOfParallelism = 10 },this.PeformOperation)); //note that with maxDegreeOfParallelism set to a high value (like 1000) //then I'll get a TON of failed requests simply because I'm overloading the network //either that or google thinks I'm DDOSing them... >_< return values.Where(v => v.Value == true).Count(); } void PeformOperation(KeyValuePair<string,bool?> kvp) { try { WebRequest request = WebRequest.Create("http://google.co.nz/"); request.Timeout = 100; //I'm not actually setting up the proxy from kvp,//because it's populated with bogus data request.GetResponse(); values[kvp.Key] = true; } catch (WebException) { values[kvp.Key] = false; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |