C# 在一小时内调用Web API 3万次
我需要在一个小时的时间跨度内,从用户机器上调用windows应用程序在不同网络上托管的Web API 30000次 我尝试了多线程来达到同样的效果,但如果系统内存不足,则无法正常工作 我使用了如下的跑步池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
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);