2012-04-05 41 views
0

我有一些功能需要在我的C#应用​​程序中异步。这是一个相当简单的工作流程,所以我不需要花费它,我基本上需要相当于jQuery.DeferredDo Rx扩展给我的功能类似于jQuery.Deferred?

我的方法应该返回一个人们可以附加成功和失败处理程序的对象。成功或失败处理程序只会触发一次。我还需要一种方法来在异步过程完成时触发成功/失败。

所以我想是这样的:因为我做了最后一次,我几年前需要这种功能,但不存在”新的东西,使

var asyncTask = ReadSomeStatsFrom("a-really-big-file.txt"); 
asyncTask.OnSuccess += (stats) => Console.WriteLine("Completed " +stats.ToString()); 
asincTask.OnFail += (err) => Console.WriteLine("Uh Oh "+err.ToString()); 
//return control to the calling method and go on to do other stuff 

是的,我可以创建线程和模拟这样的事情现在这整齐整齐?我已经听说过Rx,它似乎正在解决类似的问题领域(显然还有更多)。

因此问题1:我在正确的轨道上看着Rx的这个功能吗?如果不是我应该看的。

问题2:如何将上面的例子看起来与RX,包括实际上这标志着任务成功完成或已结束内部ReadSomeStatsFrom()

回答

3

看一看任务库相同常也。它随同clr一起提供,它非常适合您的需求。 Rx主要针对事件流,而不是单个事件。

我已经看到一个示例,其中异步IO(您的文件读取)几乎直接包装在tpl任务中,但这可能是4.5功能。

4

Rx看起来非常适合您的需求。

如果ReadSomeStatsFrom可以写同步那就试试这个:

Observable 
    .Start(() => ReadSomeStatsFrom("a-really-big-file.txt")) 
    .Subscribe(
     stats => Console.WriteLine("Completed " + stats.ToString()), 
     err => Console.WriteLine("Uh Oh " + err.ToString())); 

我同意TPL可能是一个不错的选择太多,但可以的Rx在许多方面比TPL更有表现力。