我有一个api-dll,其中一个方法执行长时间运行的作业。在此执行期间,我有可能获得作业的当前状态,该状态在作业运行时为“已启动”,如果作业已结束则为“已完成”。我没有其他方法可以检测外部作业是正在运行还是已完成。
现在我从自己的dll中调用此api方法,并且可以编写“ while”
var jobState = SomeApi.GetJobState();
while (jobState.JobStatus == EnumJobStatus.STARTED)
{
Thread.Sleep(2000);
jobState = SomeApi.GetJobState();
}
这里的问题显然是,这将使用大量cpu,这是不可行的。
因此,我需要找到另一种方法来等待作业完成。有人有建议吗?
我们非常感谢您的帮助
谢谢!
答案 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);
}
}