0

我的 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()

4

3 回答 3

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

于 2012-04-07T10:18:13.840 回答
3

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

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

于 2012-04-05T19:45:04.487 回答
1

Task Parallel Library 是您正在寻找的,这里的链接http://msdn.microsoft.com/en-us/library/ee372288.aspx将解释该库的功能。

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

于 2012-04-05T20:00:16.993 回答