低内存上的 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 循环将始终显示至少一条消息。
代码运行良好,在我自己的计算机上正常执行。在我提到的服务器上运行它做了一些我似乎无法理解的事情。
从听起来,我认为这是一个线程管理问题。您的 i7 应该有 12 个可用线程、优先级和工作站上的负载可能会影响其执行方式。试用线程池并保持程序运行,直到执行完成