2011-06-29 13 views
2

说我想调用一个异步调用,并且如果调用已经在运行,请不要执行任何操作。使用.NET的反应式扩展而不是以下'运行如果未运行'模式

在普通C#我可能会写以下(一会儿忽视线程安全问题)

private bool aysncHappening = false; 
private DoWorkInBgThread() 
{ 
    if(asyncHappening) 
    { 
    return; 
    } 
    asyncHappening = true; 

    RunMeOnABackgroundThread +=()=> 
    { 
    try 
    { 
     someWorkHere; 
    } 
    finally 
    { 
     asyncHappening = false; 
    } 
    }; 
} 

我怎样才能达到同样的,Execute if Not already running,其中Rx?

回答

3

这个问题,正如措辞,并不适合一个满意的答案。 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); 
+0

感谢您的解释。所以Rx不一定是以不同的方式处理异步调用的方式吗? – Alan

+1

哦,嘿斯科特!我怎么知道我会在Rx的问题中找到你... – Domenic

+0

@Alan - 这是,但你只要求一个非常特定形式的异步调用 –

相关问题