Rx Extensions 是否为我提供了类似于 jQuery.Deferred 的功能

本文关键字:jQuery 类似于 Deferred 功能 是否 Extensions Rx | 更新日期: 2023-09-27 18:30:14

我的 C# 应用程序中有一些需要异步的功能。这是一个相当简单的工作流程,所以我不需要花哨它,我基本上需要相当于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() 内成功或结束

Rx Extensions 是否为我提供了类似于 jQuery.Deferred 的功能

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更具表现力。

也看看任务平行库。它随 clr 一起提供,更适合您的需求。Rx 主要用于事件流,而不是单个事件流。

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

任务并行库就是你要找的,这里的链接 http://msdn.microsoft.com/en-us/library/ee372288.aspx 解释库的功能。

具体来说,您希望将响应作为页面上讨论的延续来处理。