Многопоточность, приводящая к условиям гонки - PullRequest
1 голос
/ 25 сентября 2019

Вот мой фрагмент

Public async Task DoSomething(List<T> dataList)
{
    foreach (T claim in dataList)
    {
        var claimLineTask = AssembleClaimLines(claim);
        tasks.Add(claimLineTask);
    }
    await Task.WhenAll(tasks);
    return dataList;
}

protected async Task AssembleClaimLines(T claim)
{
    connector.ConfigSettingsSection = "Claims.Lines";
    connector.QueryParameters = new Dictionary<string, string>()
    {
        {“id”, claim.ID.ToString()},
    };
    claim.data = await connector.GetData()            
    return;
}

У меня есть условие гонки при вызове AssembleClaimLines(). Значения connector.QueryParameters переопределяются одним из потоков.В конечном итоге у меня много повторяющихся звонков.

Одно простое решение - я могу передать connector в качестве параметра для AssembleClaimLines.Но я не могу этого сделать, поскольку connector передается от внедрения зависимости.Как еще можно решить условие гонки и при этом полностью использовать многопоточность?

1 Ответ

3 голосов
/ 25 сентября 2019

Либо необходимо изменить Connector API для поддержки нескольких одновременных вызовов (например, перевести ConfigSettingsSection / QueryParameters в аргументы на GetData), либо вам потребуется получить несколько Connector экземпляров (например, введите ConnectorFactory вместо Connector).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...