C#处理信息时表单冻结 [英] C# Form freeze when processing information

查看:17
本文介绍了C#处理信息时表单冻结的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为自己编写了一个个人网络抓取工具,用于抓取艺术家信息.代码有效,但是当我按下按钮并开始处理 while 循环时,GUI 冻结.我将文本框设置为 .refresh().但是我不能移动表格,取消程序的唯一方法是强制退出.我正在重写这个,所以我没有遇到这个问题.另外,我听说过踩踏,想看看这是否可行,并且让它更快一点.该程序正在抓取 15,000 多个页面,然后每个页面还有另外 10 个左右的页面需要抓取.因此,该程序可能会在最终完成之前运行数小时.

I wrote a personal web scraper for myself that scraps artist information. the code works but when I press the button and it start processing the while loop, the GUI freezes. I got the textBoxes to .refresh(). But I can't move the form, also the only way to cancel the program is to force quit. I'm in the process of rewriting this so I don't get this problem. also, I heard about treading and wanted to see if that would work, and also make it a little faster. the program is scraping 15,000+ pages, and then each page has another 10 or so pages it needs to scrape. So, the program could run for hours before it's finally finished.

这是我的代码.

        private void btnGet_Click(object sender, EventArgs e)
    {
        int i = 0;
        int maxCount = 15000; //11234 was last value 

        progressBar.Maximum = maxCount;

        while (i <= maxCount)
        {
            txbURL.Text = "http://www.newreleasetuesday.com/albumdetail.php?album_id=" + i;
            label.Text = i.ToString() + " out of " + maxCount.ToString() + " Done.";
            progressBar.Value = i;

            string url = txbURL.Text;

            string sourceCode = sourceCode = WorkerClass.getSourceCode(url);
            int startIndex = sourceCode.IndexOf("//alert(document.getElementById(\"remcheck\").value)");
            sourceCode = sourceCode.Substring(startIndex, sourceCode.Length - startIndex);

            //Start Artist Name
            //Gets the Artist's ID
            int idCountIndex = sourceCode.IndexOf("  by <a href=\"artistdetail.php?artist_id=") + 41;
            int idCountEndIndex = sourceCode.IndexOf("\">", idCountIndex);
            string artistID = sourceCode.Substring(idCountIndex, idCountEndIndex - idCountIndex) + "";
            txbArtistID.Text = artistID;

            //Gets Artist's Name
            startIndex = sourceCode.IndexOf("  by <a href=\"artistdetail.php?artist_id=") + 43 + artistID.Length;
            int endIndex = sourceCode.IndexOf("</a> | Genre", startIndex);
            string artistName = sourceCode.Substring(startIndex, endIndex - startIndex) + "";
            txbArtist.Text = artistName;
            //End Artist Name

            //Start Album Name
            //Gets Album's ID
            string albumID = url.Substring(url.IndexOf("=") + 1);
            txbAlbumID.Text = albumID;

            //Gets Album's Name
            startIndex = sourceCode.IndexOf("absbottom\"></span></strong> ") + 28;
            endIndex = sourceCode.IndexOf("</span></td>", startIndex);
            string AlbumName = sourceCode.Substring(startIndex, endIndex - startIndex) + "";
            txbAlbum.Text = AlbumName;
            //End Album Name

            //Start Genre
            startIndex = sourceCode.IndexOf("</a> | Genre: ") + 14;
            endIndex = sourceCode.IndexOf(" | ", startIndex);
            string genre = sourceCode.Substring(startIndex, endIndex - startIndex) + "";
            txbGenre.Text = genre;
            //End Genre

            //Start Release Date
            startIndex = sourceCode.IndexOf("<a href=\"releasedate.php?release_date=") + 50;
            endIndex = sourceCode.IndexOf(" </a></td>", startIndex);
            string releaseDate = sourceCode.Substring(startIndex, endIndex - startIndex) + "";
            txbReleaseDate.Text = releaseDate;
            //End Release Date

            //Start Pic URL
            startIndex = sourceCode.IndexOf("<img  src=\"") + 11;
            endIndex = sourceCode.IndexOf("\"  alt=", startIndex);
            string PicURL = sourceCode.Substring(startIndex, endIndex - startIndex) + "";
            PicURL = PicURL.Replace("amp;", "");
            string fullLink = "http://www.newreleasetuesday.com/" + PicURL;
            txbPicURL.Text = fullLink;
            //End Pic URL


            //Refresh UI (Updates textBoxes, labels, and progressBar with new values)
            txbURL.Refresh();
            txbArtist.Refresh();
            txbAlbum.Refresh();
            txbReleaseDate.Refresh();
            txbGenre.Refresh();
            txbPicURL.Refresh();
            txbArtistID.Refresh();
            txbAlbumID.Refresh();
            label.Refresh();
            progressBar.Refresh();

            if (artistName == "")
            {
                // Adding info to Database if there is no artist name
                string cs = "SERVER=asdf.net;" +
                    "DATABASE=music;" +
                    "UID=root;" +
                    "PASSWORD=asdf;";

                MySqlConnection conn = null;

                conn = new MySqlConnection(cs);
                conn.Open();

                MySqlCommand cmd = new MySqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = "INSERT INTO `emptyalbums` (id, albumid) VALUES('',@albumid)";
                cmd.Prepare();

                cmd.Parameters.AddWithValue("@albumid", albumID);

                cmd.ExecuteNonQuery();
                conn.Close();
            }
            else
            {
                // Adding info to Database if there is an artist name
                string cs = "SERVER=asdf.net;" +
                    "DATABASE=music;" +
                    "UID=root;" +
                    "PASSWORD=asdf;";

                MySqlConnection conn = null;

                conn = new MySqlConnection(cs);
                conn.Open();

                MySqlCommand cmd = new MySqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = "INSERT INTO `database` (id, artist, album, releasedate, genre, pictureurl, artistid, albumid) VALUES('',@artist, @album, @releasedate, @genre, @pictureurl, @artistid, @albumid)";
                cmd.Prepare();

                cmd.Parameters.AddWithValue("@artist", artistName);
                cmd.Parameters.AddWithValue("@album", AlbumName);
                cmd.Parameters.AddWithValue("@releasedate", releaseDate);
                cmd.Parameters.AddWithValue("@genre", genre);
                cmd.Parameters.AddWithValue("@pictureurl", fullLink);
                cmd.Parameters.AddWithValue("@artistid", artistID);
                cmd.Parameters.AddWithValue("@albumid", albumID);

                cmd.ExecuteNonQuery();
                conn.Close();
            }
            i++;
            
        }

任何信息都会大有帮助.谢谢,Throdne

Any info would go a long way. Thanks, Throdne

推荐答案

多线程确实可以解决您的问题.这里发生的情况是处理在您的 GUI 线程上启动,并且一切都冻结,直到您的循环完成处理.

Multi-threading is indeed the solution to your problem. What happens here is that the treatment is launched on your GUI Thread and everything freezes until your loop has finished processing.

多线程的实现将取决于您的框架和您的需求,但如果您使用 .Net 4.0,您可能需要查看 TPL 库.

The implementation of multi-threading will depend on your framework and your needs, but if you use .Net 4.0 you might want to check out the TPL library.

http://msdn.microsoft.com/en-us/library/dd460717.aspx

除此之外,在谷歌上搜索一个关于多线程的简单搜索就可以让你立即到达你想去的地方.

Other than that, a simple google search about mutli-threading will get you where you want to be in no time.

这篇关于C#处理信息时表单冻结的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆