Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一小时内调用Web API 3万次_C#_Multithreading_Winforms_Threadpool - Fatal编程技术网

C# 在一小时内调用Web API 3万次

C# 在一小时内调用Web API 3万次,c#,multithreading,winforms,threadpool,C#,Multithreading,Winforms,Threadpool,我需要在一个小时的时间跨度内,从用户机器上调用windows应用程序在不同网络上托管的Web API 30000次 我尝试了多线程来达到同样的效果,但如果系统内存不足,则无法正常工作 我使用了如下的跑步池 private static object threadLock = new object(); public delegate void BarDelegate(); int ThreadCount = dtExcel.Rows.Count; private void button2_C

我需要在一个小时的时间跨度内,从用户机器上调用windows应用程序在不同网络上托管的Web API 30000次

我尝试了多线程来达到同样的效果,但如果系统内存不足,则无法正常工作

我使用了如下的跑步池

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.
    }
}
上述方法在内部执行繁重的任务,如请求加密和数字签名以及响应解密和数字签名验证

请帮助我以最好的方式尽可能,我可以执行任务的时间段内,而不会得到SystemOutOfmemoryException


提前感谢。

现在,由于访问progressBar.Value的竞争条件,您的代码被严重破坏。讨论任何其他问题都是毫无意义的,因为您将完全重新组织代码以修复竞争条件,从而使其他注释过时


修复它,使您没有N个线程都试图处理第1项,然后用新代码问一个新问题。

此api的所有者是否知道您将每秒敲打8.5次,每次敲打一小时?当然,最好改进API以接受数据块,并使用async/await进行尝试。您的操作受I/O限制,因此启动线程是浪费。尽管我认为您需要一种不同的方法,但不管怎样。int ThreadCount=dtExcel.Rows.Count;-你想启动3万个线程来完成这个任务@CaiusJard Yes API所有者知道命中率,但由于某些限制,我们无法对API进行任何更改。@CaiusJard我正在为30000个请求创建一个线程池。
service.CallAPIService(para1, para2, para3, para4, para5);