SmartThreadPool阻止UI线程

时间:2012-10-09 08:00:21

标签: multithreading

当我点击按钮时,我正在运行以下代码:

                foreach (string item in urlQueue)
                {

                    log("creating job " + iia.ToString());
                    _smartThreadPool.QueueWorkItem(
                        new Amib.Threading.Func<string, int, int, string, int>(checkURLSmart),
                        item, iia, 5000, kryptonTextBox1.Text);

                    iia++;
                }

                Application.DoEvents();

                _smartThreadPool.Start();

                _smartThreadPool.WaitForIdle();
                _smartThreadPool.Shutdown();

由于某些原因,这是阻止UI线程,任何想法如何解决这个问题?我希望UI在队列工作时响应

1 个答案:

答案 0 :(得分:0)

您不应该在GUI线程中调用WaitForIdle()。 在.NET中使用http://msdn.microsoft.com/en-us/library/a06c0dc2.aspx或在Java中使用http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html invokeLater()。

此机制将您的代码放入队列中以便在GUI线程中执行。因此,您可以使用回调参数中的已处理数据更新GUI视图。

另请参阅有关Invoke&amp; amp;和BeginInvoke:What's the difference between Invoke() and BeginInvoke()