等待外部api方法完成

时间:2019-04-10 14:36:31

标签: c# api asynchronous async-await

我有一个api-dll,其中一个方法执行长时间运行的作业。在此执行期间,我有可能获得作业的当前状态,该状态在作业运行时为“已启动”,如果作业已结束则为“已完成”。我没有其他方法可以检测外部作业是正在运行还是已完成。

现在我从自己的dll中调用此api方法,并且可以编写“ while”

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

这里的问题显然是,这将使用大量cpu,这是不可行的。

因此,我需要找到另一种方法来等待作业完成。有人有建议吗?

我们非常感谢您的帮助

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以为此使用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使用调度程序,因此在CPU上非常轻便。您还可以非常轻松地通过TakeUntil添加取消等待。

答案 1 :(得分:1)

如果您想要的是async-await,请尝试以下操作:

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