Я разрабатываю библиотеку, которая вызывает и запрашивает данные с URL-адреса в Интернете, используя метод requestAndParse()
.Я хочу сделать библиотеку устойчивой к тому, чтобы пользователь несколько раз быстро обращался к серверу.
Асинхронный метод в настоящее время состоит из двух частей.Во-первых, он запрашивает данные из URL, используя request = client.GetStringAsync
.Затем он анализирует эти данные из результата request
и возвращает эти данные в форме структуры.Для целей этого примера я вызываю эту структуру Data
.
. У меня уже есть код, который защищает от нескольких запросов http, сохраняя httprequest в качестве переменной и создавая новый экземпляр только в том случае, если старый запросзавершено или не существует (пусто).
Затем следующая часть анализирует данные.Это очень долгий процесс, который я хотел бы запустить только один раз для каждого httpRequest.Однако, так как мой код настроен прямо сейчас, часть синтаксического анализа будет запускаться каждый раз, когда выполняется код requestAndParse()
, даже если есть только один http-запрос.
Код - это нечто вроде строки:
class ServerRequester {
private HttpClient = client;
private Task<string> request = null;
public async Task<Data> requestAndParse() {
if (request == null || request.IsCompleted()) {
// Instantiate new request if there is nothing running already
request = client.GetStringAsync(url);
}
// Wait for request
this.response = await request;
/**
**
** parse data
** ...
**/
return data;
}
}
Дело в том, что если я, например, вызову requestAndParse()
10 раз очень быстро, мне придется анализировать одни и те же данные из одного и того же http-запроса 10 раз.Если синтаксический анализ стоит дорого, или если анализирует состояние магазина для последующего использования, это означает, что я добавлю одни и те же данные 10 раз.Есть ли способ сделать этот код выполненным только один раз, но все же возвращенным в цикл for, просто отлично?