在一个小时的时间内呼叫Web API 3万次

时间:2018-10-17 13:42:32

标签: c# multithreading winforms threadpool

我需要在一个小时的时间内从用户计算机的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。

谢谢。

1 个答案:

答案 0 :(得分:1)

现在,由于竞争条件访问progressBar.Value,您的代码已被严重破坏。讨论任何其他问题都是没有意义的,因为您将完全重组代码以解决竞争状况,从而使其他注释过时。

修复该错误,以使您没有N个线程都在尝试处理项目#1,然后用新代码询问新问题。