使用.NET的反应式扩展而不是以下';如果未运行则运行';模式
本文关键字:运行 如果 模式 反应式 NET 扩展 使用 | 更新日期: 2023-09-27 18:00:48
假设我有一个异步调用要调用,如果该调用已经在运行,请不要执行任何操作。
在普通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);