我有一个api-dll,其中一个方法执行一个长时间运行的作业。在执行期间,我可以在作业运行时获取作业“已启动”的当前状态,并在作业结束时“完成”。我无法检测外部作业是在运行还是已完成。
现在我从我自己的dll中调用这个api方法,我可以写一个“while”
var jobState = SomeApi.GetJobState();
while (jobState.JobStatus == EnumJobStatus.STARTED)
{
Thread.Sleep(2000);
jobState = SomeApi.GetJobState();
}
这里的问题很明显,这将使用相当多的CPU,这是一个禁忌。
所以我需要找到另一种等待工作完成的方法。有人有建议吗?
任何帮助都非常感谢
提前致谢!
您可以使用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
添加等待的取消。
如果你想要的是async-await
,试试这个:
async Task WaitForJobToCompleteAsync()
{
while (SomeApi.GetJobState().JobStatus == EnumJobStatus.STARTED)
{
await Task.Delay(2000);
}
}