4

私は C# プログラマですが、F# の非同期ワークフローについて質問があります。C# クラス ライブラリに次のクラスがあるとします。

class File {
 IAsyncResult BeginReadAll(string fileName, AsyncCallback callback, object state){}
 string EndReadAll(IAsyncResult result){}
}

私の理解では、F# では、次のように呼び出すことができる ReadAllAsync という関数を作成できます。

async {  let! rsp = ReadAllAsync() }

また、呼び出し元のスレッドをブロックするのではなく、それをスレッド プールに解放し、操作が終了すると別のスレッドに戻ります。Async.Primitive を使用して F# でこれをコーディングする方法を理解していると思いますが、私の質問は、この ReadAllAsync 関数を C# コードから呼び出すことはできますか? その場合、F# コードをクラス ライブラリにパッケージ化して C# からアクセスするにはどうすればよいですか?

4

2 に答える 2

2

幸い、Beta2が到着すると、F#コアライブラリのAsyncモジュールに次のメソッドが含まれます。

/// Return three functions that can be used to implement the .NET Asynchronous 
/// Programming Model (APM) for a given asynchronous computation.
/// 
/// The functions should normally be published as members with prefix 'Begin',
/// 'End' and 'Cancel', and can be used within a type definition as follows:
/// <c>
///   let beginAction,endAction,cancelAction = Async.AsBeginEnd computation
///   member x.BeginSomeOperation(callback,state) = beginAction(callback,state)
///   member x.EndSomeOperation(iar) = endAction(iar)
///   member x.CancelSomeOperation(iar) = cancelAction(iar)
/// </c>
///
/// The resulting API will be familiar to programmers in other .NET languages and 
/// is a useful way to publish asynchronous computations in .NET components.
static member AsBeginEnd : computation:Async<'T> ->                     // '
                             // The 'Begin' member
                             (System.AsyncCallback * obj -> System.IAsyncResult) * 
                             // The 'End' member
                             (System.IAsyncResult -> 'T) *              // '
                             // The 'Cancel' member
                             (System.IAsyncResult -> unit)

これにより、F#を使用して非同期コードを簡単に記述できますが、通常のAPMを使用してC#またはVBに公開し直すことができます。

于 2009-07-23T07:55:28.910 に答える