Чтобы избежать проблем с многопоточностью, вам необходимо как минимум реализовать единый потокобезопасный способ.Эта статья Джона Скита описывает некоторые способы создания одноэлементного экземпляра безопасным для потоков способом.Кроме того, вы должны убедиться, что методы синглтона могут обрабатывать параллельные запросы или использовать lock
для синхронизации вызовов.
Проблема использования Singleton в статическом методе также связана с объектно-ориентированным проектированием.Наличие одноэлементного приложения и его использование во многих местах вашего приложения удобно, но имеет свои недостатки:
- С первого взгляда разработчик не видит, что ваши методы полагаются на одноэлементный экземпляр.Это скрытая зависимость.
- Кроме того, вы не можете легко изменить экземпляр в тех случаях, когда вам нужно другое поведение, например, в тестах.
Поэтому я хотел бы подумать о том, действительно ли нужен синглтон или вы можете добавить его в качестве параметра в методы, где он необходим:
public static async Task<string> GetData(API api, string id)
{
HttpResponseMessage response = await
api.Instance.GetAsync(string.Format(requestURL, id));
response.EnsureSuccessStatusCode();
// return URI of the created resource.
return await response.Content.ReadAsStringAsync();
}
Выможет изменить метод на метод расширения, который вы можете вызвать следующим образом:
var result = await API.Instance.GetData("123");
Вы просто должны добавить this
к подписи:
public static async Task<string> GetData(this API api, string id)
{
// ...
}