低内存上的 C# 程序 - 后台工作线程在结束之前未完成 DoWork 任务

本文关键字:结束 未完成 任务 DoWork 线程 工作 内存 程序 后台 | 更新日期: 2023-09-27 18:30:41

我目前正在尝试在具有 i7 处理器、512 MB 内存并运行 w7 ultimate 的 VPS 上运行用 C# 编写的 Web 机器人(Web 请求)。该程序使用后台工作线程来完成主要工作,以免冻结 GUI。

但是,每当我尝试运行该程序时,它都会意外结束(显示我为我的 bgw 工作完成事件提供的消息),而不会运行程序的主要部分。

512 mb 内存是否太低而无法运行此程序?当我尝试运行它时,它接近最大使用率百分比。我自己的计算机可以自行运行机器人。机器人从三个富文本框中获取用户输入,并将它们存储到字符串数组中,每个数组都有大约 ~3k 个条目。

我的办公代码:

 private void mainWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        var values = (UserInputData)e.Argument;
        int submits = 0;
        string[] emaillist = values.emails;
        string[] addresses = values.addys;
        string[] allname = values.names;
        int addresscount = 0;
        for (int i = 0; i < emaillist.Length; i++)
        {
            string emailAddress = emaillist[i];
            string addy = addresses[addresscount];
            string[] addysplit = addy.Split('|');
            string street = addysplit[0];
            string city = addysplit[1];
            string state = addysplit[2].Substring(0, 2);
            string zip = addysplit[3];
            string name = allname[i];
            string[] namesplit = name.Split('|');
            string fname = namesplit[0];
            string lname = namesplit[1];
            mainWorker.ReportProgress(1, emailAddress);
            HttpSession submit = new HttpSession();
            submit.setUserAgent();
            submit.getPage("");
            string postDataEmail = "...";
            if (submit.html.Contains(".."))
            {
                submits++;
                mainWorker.ReportProgress(90, submits.ToString());
                continue;
            }
            else
            {
                mainWorker.ReportProgress(50);
                Image captchaImg = getImage(captchaUrl);

                string postdata = "...";
                submit.postPage("...", postdata);
                if (submit.html.Contains("..."))
                {
                    submits++;
                    saveToTextFile("submitted emails", emailAddress);
                    saveToTextFile("info", emailAddress + ":" + addy + ":" + name);
                    mainWorker.ReportProgress(90, submits.ToString());
                }
                else if (submit.html.Contains("Enter code in field"))
                {
                    mainWorker.ReportProgress(80);
                    decap.reportBadCaptcha();
                    i--;
                    addresscount++;
                    continue;
                }

                addresscount++;
            }
        }
    }

电子邮件列表数组从值的丰富文本框填充。我的 reportprogress 事件处理程序将一条消息打印到 gui,让我知道我在执行期间的位置。运行 for 循环将始终显示至少一条消息。

代码运行良好,在我自己的计算机上正常执行。在我提到的服务器上运行它做了一些我似乎无法理解的事情。

低内存上的 C# 程序 - 后台工作线程在结束之前未完成 DoWork 任务

从听起来,我认为这是一个线程管理问题。您的 i7 应该有 12 个可用线程、优先级和工作站上的负载可能会影响其执行方式。试用线程池并保持程序运行,直到执行完成