Какой шаблон следует использовать для предотвращения переполнения асинхронных вызовов, которые занимают слишком много времени - PullRequest
0 голосов
/ 25 мая 2018

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

Например.Мой синхронный код на C # выглядит примерно так;

Stopwatch Stopwatch = new Stopwatch();
while (true) 
{
    Stopwatch.StartNew();

    await GetDataFromApiMethod();
    await ProcessDataFromApiMethod();

    Stopwatch.Stop();
    int Delay = 200 - (int)Stopwatch.ElapsedMilliseconds;
    if (Delay < 0) 
        Debug.WriteLine("Price Scheduler lag->" + Delay + "ms.");
    await Task.Delay(Delay);
}

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

Теперь, если я сделал два вышеуказанных ожидаемых вызова асинхронными.Что происходит, когда процессор не успевает?... и как с этим справиться?Есть ли общий шаблон для такого рода проблем?

1 Ответ

0 голосов
/ 25 мая 2018

Вместо того, чтобы использовать цикл while, вы можете рассмотреть возможность использования BackgroundWorker (https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx)

). Это вызовет ваши запросы API в отдельном потоке от основного потока вашего приложения, который, вероятно, является источником "задержки"."Вы упомянули, особенно если это ваш поток пользовательского интерфейса. Вместо того, чтобы делать запрос каждые 200 мс, вы можете положиться на события BackgroundWorker (т.е. RunWorkerCompleted), чтобы выполнить другой запрос только после завершения предыдущего (вы, конечно, всегда можете включитьминимальная задержка в 200 мс между запросами путем проверки истекшего времени в обработчике событий RunWorkerCompleted)

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