Дождитесь завершения внешнего метода API - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть api-dll, в котором метод выполняет долгосрочное задание.Во время этого выполнения у меня есть возможность получить текущее состояние задания, которое «Запущено» во время выполнения задания и «Завершено», если задание завершено.У меня нет другого способа определить, запущено или завершено внешнее задание.

Теперь я вызываю этот метод API из своей собственной библиотеки DLL и могу написать "while"

var jobState = SomeApi.GetJobState();
while (jobState.JobStatus == EnumJobStatus.STARTED)
{
   Thread.Sleep(2000);
   jobState = SomeApi.GetJobState();
}

.Проблема здесь заключается в том, что здесь будет использоваться довольно много процессоров, которые не нужны.

Так что мне нужно найти другой способ дождаться окончания работы.У кого-нибудь есть предложения?

Любая помощь высоко ценится

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 10 апреля 2019

Вы можете использовать Observables для этого:

SomeApi.JobStart();
var jobStatus = await Observable.Interval(TimeSpan.FromSeconds(10))
      .Select(_ => SomeApi.GetJobState())
      .Where(x => x != EnumJobStatus.STARTED)
          .FirstAsync();

// or instead of .FirstAsync()

          .Where(..)
          .Take(1)
          .Subscribe(()=> /* do something */); // you can dispose subscription to cancel the timer

jobStatus будет содержать первый не STARTED код.

Observable.Interval использует планировщики, поэтому очень сильно загружает процессор.Вы также можете очень легко добавить отмену ожидания через TakeUntil.

1 голос
/ 10 апреля 2019

Если вы хотите async-await, попробуйте это:

async Task WaitForJobToCompleteAsync()
{
    while (SomeApi.GetJobState().JobStatus == EnumJobStatus.STARTED)
    {
        await Task.Delay(2000);
    }
}
...