使用.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

使用.NET的反应式扩展而不是以下';如果未运行则运行';模式

这个问题的措辞并不能给出令人满意的答案。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);
相关文章: