Вызовите веб-API 30 000 раз в течение одного часа - PullRequest
0 голосов
/ 17 октября 2018

Мне нужно вызывать 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.

Спасибозаранее.

1 Ответ

0 голосов
/ 17 октября 2018

Прямо сейчас ваш код ужасно нарушен из-за состояния гонки, связанного с progressBar.Value.Бессмысленно обсуждать любые другие вопросы, потому что вы собираетесь полностью реорганизовать свой код, чтобы исправить состояние гонки, сделав другие комментарии устаревшими.

Исправьте это так, чтобы у всех N потоков не было попыток обработать элемент# 1, а затем задайте новый вопрос с вашим новым кодом.

...