Silverlight F#库和WCF

时间:2011-02-19 23:41:36

标签: c# .net silverlight wcf f#

我有一个WCF服务(可能是多个服务)和Silverlight(C#)中的客户端。当我在网络上的某处阅读时,F#非常适合异步和并行编程。我想试试F#并编写一个与给定WCF服务通信的库,处理它的错误并返回结果。
除了学习新语言和函数编程之外,这样做有什么好处吗?

1 个答案:

答案 0 :(得分:5)

是的,我认为F#对于这种情况下的异步编程非常有用。如果要正确编写异步代码,则需要使用BeginFoo / EndFoo方法,或者需要使用基于事件的API来避免在执行某些异步调用时阻塞UI线程。因此,您无法以通常的顺序样式编写代码 - 只需执行一个接一个的操作即可。相反,您需要将所有内容包装在包含单独异常处理的回调中。

在F#中,您可以使用隐藏所有“回调”的异步工作流,并自动将所有内容包装在异常处理程序中。因此,您可以编写将多个调用作为顺序代码的异步代码,并使用所有常用的控制流构造(例如tryforwhile,...)。你可以写:

let processData(userInputs) = async { 
  try
    let! temp = Service.AsyncDoSomething(userInputs)
    let! res = Service.AsyncDoSomethingElse(temp)
    return res
  with e ->
    // Handle exception

这将异步调用DoSomething操作,并将该函数的其余部分移动到一个回调中,该回调在操作完成时执行(类似于DoSomethingElse)。但是,异常处理可以用通常的方式编写。该功能也非常适合编写一些用户界面交互(例如参见this SO post或我的F# talk at London User Group的录制)

对于此项目使用F#的缺点是它没有对WCF的任何直接支持。你当然可以使用它,但你必须编写C#样式的可变类,看起来不那么好 - 一个很好的选择可能是使用C#库并在那里定义通常必要的WCF东西(然后只是使用来自F#)。