假设我有一个异步调用要调用,如果该调用已经在运行,请不要执行任何操作。
在普通C#中,我可能会写以下内容(暂时忽略线程安全问题(
private bool aysncHappening = false;
private DoWorkInBgThread()
{
if(asyncHappening)
{
return;
}
asyncHappening = true;
RunMeOnABackgroundThread += ()=>
{
try
{
someWorkHere;
}
finally
{
asyncHappening = false;
}
};
}
如何使用Rx实现相同的Execute if Not already running
?
这个问题的措辞并不能给出令人满意的答案。Rx是为具有需要协调的事件或数据流的情况而构建的。对于火灾和遗忘场景,它没有那么强烈。也就是说,这里有一个方法
bool inProgress = false;
var obsvr = Observer.Create<Unit>((x) =>
{
if (!inProgress)
{
inProgress = true;
Scheduler.ThreadPool.Schedule(() => {
Thread.Sleep(500);
"InBackground".Dump();
inProgress =false;
});
}
});
obsvr.OnNext(Unit.Default);
obsvr.OnNext(Unit.Default);
obsvr.OnNext(Unit.Default);
"main".Dump();
Thread.Sleep(1000);
obsvr.OnNext(Unit.Default);
Thread.Sleep(3000);