C # Блокировка и потокобезопасность вокруг потокового API - PullRequest
0 голосов
/ 06 июля 2018

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

Я использую внешний многопоточный API в многопоточной среде.

Возвращает IEnumerable<ApiDto>. Затем я сопоставляю каждое из ApiDto с DTO нашего приложения: MyDto .

Как мне убедиться, что код является поточно-ориентированным?

Например:

Это мой класс, который получает элементы из API

public class ApiRepo
{
    private IApi api;
    public ApiRepo()
    {
        api=new Api("url");
    }
    public IEnumerable<MyDto> GetItems()
    {
        var apiDtos = api.GetNonThreadSafeItems();
        foreach(var apiDto in apiDtos)
        {
           var myDto = new MyDto(apiDto.Name);  
           yield return myDto;
        }

    }

}

Это мое клиентское приложение. Создается несколько экземпляров Client, а данные извлекаются из API.

public class Client
{
    public void GetData()
    {
        var items = new ApiRepo().GetItems().ToList();
        Console.WriteLine(items.Count);
    }
}

Должен ли я установить блокировку в Client.GetData () или есть ли лучший способ сделать код безопасным для потоков?

1 Ответ

0 голосов
/ 06 июля 2018

API не «потокобезопасен» означает, что он работает на основе некоторого golbal ресурса без механизма синхронизации. Таким образом, чтобы получить правильный результат от API, вам нужно убедиться, что только один поток вызывает его одновременно. Основываясь на своем образце, самый простой способ сделать это, как

public class ApiRepo
{
    static private object theLock = new object();
    private IApi api;

    public ApiRepo()
    {
        api=new Api("url");
    }

    public IEnumerable<MyDto> GetItems()
    {
        IEnumerable<ApiDto> apiDtos = null;
        lock(theLock)
        {
            apiDtos = api.GetNonThreadSafeItems();
        }
        foreach(var apiDto in apiDtos)
        {
           var myDto = new MyDto(apiDto.Name);  
           yield return myDto;
        }
    }
}
...