【F# + ASP.NET MVC】 カスタム非同期コントローラーを作成するには

◆ 参考

Asynchronous Controller Helper

◆ Controller

namespace Sample.Controllers

open System
open System.Web
open System.Web.Mvc
open System.Net

// 非同期ユーティリティ
type AsyncActionBuilder(asyncMgr : Async.AsyncManager) = 
    // 'async' operations
    member this.Bind(v, f) = async.Bind(v, f)
    member this.Return(v) = async.Return(v)    
    (* omit
    member this.Combine(a, b) = async.Combine(a, b)
    member this.Delay(f) = async.Delay(f)
    member this.For(s, f) = async.For(s, f)
    member this.ReturnFrom(a) = async.ReturnFrom(a)
    member this.TryFinally(a, b) = async.TryFinally(a, b)
    member this.TryWith(a, b) = async.TryWith(a, b)
    member this.Using(r, f) = async.Using(r, f)
    member this.While(c, f) = async.While(c, f)
    member this.Zero() = async.Zero()
    omit *)

    member this.Run(workflow) = 
        // 保留中の操作数を1増やす
        asyncMgr.OutstandingOperations.Increment() |> ignore
        // 非同期処理を実行
        async {        
            let! res = workflow        
            // 処理結果をコレクションに追加すると、
            // Completedメソッドの引数に自動的にバインドされる。
            asyncMgr.Parameters.["result"] <- res
            asyncMgr.OutstandingOperations.Decrement() |> ignore
        }
        |> Async.Start

// カスタム非同期コントローラー
type FSharpAsyncController() = 
    inherit AsyncController()
    member this.AsyncAction = 
        new AsyncActionBuilder(this.AsyncManager)

type HomeController() =
    // カスタム非同期コントローラーを継承
    inherit FSharpAsyncController()
    // 非同期処理    
    member this.IndexAsync() = this.AsyncAction {
        // WebページのHTMLを取得
        let wc = new WebClient()
        let! html = wc.AsyncDownloadString(
                        new Uri("http://www.google.co.jp"))
        return html
    }

    // 完了処理(AsyncManager.Parameters が自動的にバインドされる)
    member this.IndexCompleted(result : string) =
        // 非同期処理の結果をセット
        this.ViewData.["Html"] <- result
        this.View() :> ActionResult

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中