我需要在一个小时的时间内从用户计算机的Windows应用程序中调用30,000次Web API(位于不同网络上)。
我尝试使用多线程来达到相同的效果,但是它不起作用(使系统内存不足,导致异常)。
我如下使用了TreadPool
private static object threadLock = new object();
public delegate void BarDelegate();
int ThreadCount = dtExcel.Rows.Count;
private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < ThreadCount - 1; i++)
{
ThreadPool.QueueUserWorkItem(output => CallAPI());
}
}
public void CallAPI()
{
string branchCode = "",
para1 = dtExcel.Rows[progressBar.Value]["para1"].ToString(),
para2 = "324",
para3 = "Test",
para4 = dtExcel.Rows[progressBar.Value]["para4"].ToString();
//Console.WriteLine(Thread.CurrentThread.Name + ": " + progressBar.Value);
var service = new APIService();
var resp = service.CallAPIService(para1, para2, para3, para4, para5);
if (resp.IsSuccess == true)
{
DataGridViewRow dtGrdVwR = dataGrid.Rows[progressBar.Value];
dtGrdVwR.Cells[3].Value = "Success";
}
else
{
DataGridViewRow dtGrdVwR = dataGrid.Rows[progressBar.Value];
dtGrdVwR.Cells[3].Value = "Failed: "+ resp.Message;
}
try
{
this.Invoke(new BarDelegate(UpdateBar));
}
catch
{
}
}
private void UpdateBar()
{
lblEndTime.Text = DateTime.Now.ToString();
progressBar.Value++;
if (progressBar.Value == progressBar.Maximum)
{
// We are finished and the progress bar is full.
}
}
这里dtExcel有30,000条记录(由用户从excel上传),需要在一小时内处理并更新dataGrid中相应行中已执行记录的状态。
API调用是通过网络执行的,单个调用大约需要1-2秒才能执行。
service.CallAPIService(para1, para2, para3, para4, para5);
上述方法在内部执行繁重的任务,例如请求加密和数字签名以及响应解密和数字签名验证。
请以最好的方式帮助我,以便我可以在一段时间内执行任务,而不会出现SystemOutOfmemoryException。
谢谢。
答案 0 :(得分:1)
现在,由于竞争条件访问progressBar.Value
,您的代码已被严重破坏。讨论任何其他问题都是没有意义的,因为您将完全重组代码以解决竞争状况,从而使其他注释过时。
修复该错误,以使您没有N个线程都在尝试处理项目#1,然后用新代码询问新问题。