首页 > 解决方案 > ThreadPool.QueueUserWorkItem 使 UI 挂起

问题描述

ThreadPool.QueueUserWorkItem在 C# 中使用线程WinForms,但它使主 UI 挂起不知道为什么,是否有任何其他好的线程而不是 ThreadPool 方法可以使 UI 变得流畅!

ThreadPool.QueueUserWorkItem(new WaitCallback(KeywordSearch), cts);

private void KeywordSearch(object r)
{
    string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char[] alphas = (alphabet + alphabet.ToLower()).ToCharArray();

    if (this.InvokeRequired)
    {
        this.BeginInvoke((MethodInvoker)delegate ()
        {
            this.Cursor = Cursors.WaitCursor;
        });
    }
    else
    {
        this.Cursor = Cursors.WaitCursor;
    }

    foreach (char a in alphas)
    {
        MessageBox.Show(a.ToString());
        string correctkeywordforQuery = KeywordTxt.Text + " " + a;
        var webRequest = WebRequest.Create(@"https://clients1.google.com/complete/search?client=youtube&hl=en&gl=us&sugexp=ytfdc%2Ccfro%3D1%2Cfp.dquf%3D1&gs_rn=64&gs_ri=youtube&ds=yt&cp=2&gs_id=6l&q=" + correctkeywordforQuery + "&callback=google.sbox.p50&gs_gbg=7dNuEZN941O5Tlh1iM");
        string result;

        using (var response = webRequest.GetResponse())
        using (var content = response.GetResponseStream())
        using (var reader = new StreamReader(content))
        {
            var strContent = reader.ReadToEnd();
            result = strContent.Replace("google.sbox.p50 && google.sbox.p50(", ""); ;
            //text.Remove(text.ToString().LastIndexOf(character), character.Length);
            result = result.Remove(result.Length - 1);
        }
        var jsonser = new JavaScriptSerializer();
        var obj = jsonser.Deserialize<dynamic>(result);
        foreach (var x in obj[1])
        {
            //CancellationToken token = (CancellationToken)r;

            //if (token.IsCancellationRequested)
            //{
            //    cts.Cancel();
            //    return;
            //}
            var value1 = x[0]; // bd felek

            // MessageBox.Show(value1);

            string thecorrectlinktogetallthedata = "https://www.youtube.com/results?search_query=" + value1+ "&hl=en";
            // Process.Start(thecorrectlinktogetallthedata);
            if (richTextBox1.InvokeRequired)
            {
                this.BeginInvoke((MethodInvoker)delegate ()
                {
                    richTextBox1.Text += "\r\n"+thecorrectlinktogetallthedata;
                });
            }
            else
            {
                richTextBox1.Text += "\r\n" + thecorrectlinktogetallthedata;
            }
            //   Process.Start(thecorrectlinktogetallthedata);

            // create the constructor with post type and few data
            //show the response string on the console screen.
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(thecorrectlinktogetallthedata);
            string htmlcontent = string.Empty;

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                htmlcontent = reader.ReadToEnd();
            }

            HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
            HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
            document.LoadHtml(htmlcontent);

            if (richTextBox1.InvokeRequired)
            {
                this.BeginInvoke((MethodInvoker)delegate ()
                {
                    richTextBox1.Text += "\r\n" + htmlcontent;
                });
            }
            else
            {
                richTextBox1.Text += "\r\n" + htmlcontent;
            }

            //watch?v
            HtmlAgilityPack.HtmlNodeCollection Nodes = document.DocumentNode.SelectNodes("//a");
            //MessageBox.Show(Nodes.Count.ToString());
            foreach (HtmlAgilityPack.HtmlNode node in Nodes)
            {
                string ahref = node.Attributes["href"].Value;
                string classname = node.GetAttributeValue("classname", string.Empty);
                //MessageBox.Show(ahref);

                if (ahref.Contains("watch?v"))
                {
                    string title = node.GetAttributeValue("title",string.Empty);
                    if(title.Trim().ToString()!= string.Empty)
                    {
                        //newRows[0] = title;
                        //newRows[1] = ahref; ;
                        if (ResultGrid.InvokeRequired)
                        {
                            ResultGrid.BeginInvoke((MethodInvoker)delegate ()
                            {
                                object[] newRows = { title, "https://www.youtube.com" + ahref };
                                //MessageBox.Show(title);
                                ResultGrid.Rows.Add(newRows);
                                ResultGrid.Update();
                                //ResultCountLabel.Text = ResultGrid.Rows.Count.ToString();
                            });
                        }
                        else
                        {
                            object[] newRows = { title, "https://www.youtube.com" + ahref };
                            //
                            ResultGrid.Rows.Add(newRows);
                            ResultGrid.Update();
                            //ResultCountLabel.Text = ResultGrid.Rows.Count.ToString();
                        }
                    }
                }
            }
            break;
        }
    }

    if (this.InvokeRequired)
    {
        this.BeginInvoke((MethodInvoker)delegate ()
        {
            this.Cursor = Cursors.Default;
        });
    }
    else
    {
        this.Cursor = Cursors.Default;
    }
}

标签: c#winformsthreadpool

解决方案


推荐阅读