等待外部api方法完成

问题描述 投票:0回答:2

我有一个api-dll,其中一个方法执行一个长时间运行的作业。在执行期间,我可以在作业运行时获取作业“已启动”的当前状态,并在作业结束时“完成”。我无法检测外部作业是在运行还是已完成。

现在我从我自己的dll中调用这个api方法,我可以写一个“while”

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

这里的问题很明显,这将使用相当多的CPU,这是一个禁忌。

所以我需要找到另一种等待工作完成的方法。有人有建议吗?

任何帮助都非常感谢

提前致谢!

c# api asynchronous async-await
2个回答
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
投票

如果你想要的是async-await,试试这个:

async Task WaitForJobToCompleteAsync()
{
    while (SomeApi.GetJobState().JobStatus == EnumJobStatus.STARTED)
    {
        await Task.Delay(2000);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.