Безопасность потоков, когда разные процессы обращаются к одним и тем же ресурсам - PullRequest
0 голосов
/ 25 февраля 2020

Я работаю со службами windows, чтобы получить некоторые данные из API

Служба # 1 получает данные от "http://api.provider.com/Entity1"

Служба # 2 получает данные из "http://api.provider.com/Entity2"

, и у меня есть обе эти службы в одном .csproj, и я использую одноэлементный httpClient для извлечения данных из API:

public sealed class Client : HttpClient{

private static readonly object padlock = new object();
private static Client instance = null;
public static Client Instance
{
    get
    {
        if (instance == null)
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Client();
                }
            }
        }
        return instance;
    }
}

private Client()
{
    DefaultRequestHeaders.Accept.Clear();
    DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json"));
    DefaultRequestHeaders.Add("...", "...");
}

public async Task<string> Get(string url)
{
    var result = await GetStringAsync(url);
    return result;
}}

но эти процессы параллельны, так что синглтон-класс является общим классом stati c для двух. И затем я использую этот класс в качестве потребителя для первого:

class APIHAndler{

public List<obj1> f1()
{
    var jsonResult = Client.Instance.Get(url1).Result;
    //make list of obj1 out of json
}

public List<obj2> f2()
{
    var jsonResult = Client.Instance.Get(url2).Result;
    //make list of obj2 out of json
}

}

Что я сделал, так это создал один экземпляр класса APIHAndler в каждой из моих служб и вызовы f1 и f2 в зависимости от текущей деятельности, и я получаю эту ошибку:

Код состояния ответа не указывает на успех: 429 (Слишком много запросов).

Я думаю, что это, вероятно, связано с тем, что два разных соединения открыты одновременно. но я не знаю, как этого избежать. Если вы можете помочь мне исправить это или найти лучшее решение, я буду очень рад услышать.

1 Ответ

0 голосов
/ 26 февраля 2020

Я не знаю, как этого избежать

Служба, на которую вы звоните, должна иметь документацию, объясняющую причины 429. Иногда это только один запрос за раз; чаще это определенное количество запросов в пределах временного окна. В любом случае вам придется регулировать ваши запросы, и вы можете создать регулирование с помощью SemaphoreSlim.

...