低ram上的C#程序 - 后台工作人员在结束前未完成DoWork任务

时间:2014-11-18 07:59:02

标签: c# backgroundworker ram

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

但是,每当我尝试运行程序时,它会意外结束(显示我对bgw workcompleted事件的消息),而不会运行程序的主要部分。

512 MB的RAM是否太低而无法运行此程序?当我尝试运行它时,它接近最大%使用率。我自己的计算机可以自行运行机器人。机器人从三个richtextbox中获取用户输入并将它们存储到字符串数组中,每个数组都有大约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循环中运行将始终显示至少一条消息。

代码运行正常并在我自己的计算机上正常执行。在我提到的服务器上运行这个,我似乎无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

通过它的声音,我认为这是一个线程管理问题。您的i7应该有12个线程可用,优先级和工作站上的负载可能会影响它的执行方式。试用threadpool并保持程序运行直到执行完毕