Мне нужно вызывать Web API (размещенный в другой сети) из приложения Windows с компьютера пользователя 30 000 раз в течение одного часа.
Я пытался использовать многопоточность, но это не работает (исключение системы из памяти).
Я использовал 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 имеет 30000 записей (загруженных пользователем из Excel), которые необходимо обработать в течение одного часа и обновитьсостояние выполненной записи в соответствующей строке в dataGrid.
Вызов API выполняется по сети, где выполнение одного вызова занимает приблизительно 1-2 секунды.
service.CallAPIService(para1, para2, para3, para4, para5);
Приведенный выше метод внутренне выполняет тяжелыйЗадача, такая как запрос шифрования и цифровая подпись и расшифровка ответа и проверка цифровой подписи.
Пожалуйста, помогите мне наилучшим способом, где я могу выполнить задачу в течение периода времени и без получения SystemOutOfmemoryException.
Спасибозаранее.