私は最近、FSharpx ライブラリ、特にそのTaskBuilderを使ってプログラミングしています。ここで、パラメーターと結果を受け取る関数を定義することが可能であるべきかどうか疑問に思います。そのような
let doTask(parameter:int) =
let task = TaskBuilder(scheduler = TaskScheduler.Current)
task {
return! Task.Factory.StartNew(fun() -> parameter + 1)
}
match FSharpx.Task.run doTask(1) with
| _ -> ()
runのソースコードを見ると、パラメータをとらずに を返す関数が必要Task<'a>
です。FSharpx TaskTestsにも例があるようには見えません。
FSharpx を使用してこのようなシナリオを実現するにはどうすればよいか、またはまだよく理解していない理由でこのようなライブラリを使用することを想定していない場合に、誰かがアドバイスしてくれれば幸いです。
<編集: doTask を次のようにラップできると思います
wrapperDoTask() = doTask(101)
match FSharpx.Task.run wrapperDoTask with
| _ -> ()
そして、それはうまくいくかもしれません。私は現在コンパイラを使用していないので、これはちょっと手が込んでいます。誰かが方向性について意見を持っていますか、それとも私は自分の質問に答えただけですか? :)
<edit2: MisterMetaphor の回答
に基づいて、これをもう一度編集する必要があると思います。特に彼のは、よく情報を提供しP.S.
ていたと思います。私は FSharpx TaskBuilder を使用して C# と相互運用します。C# では、前述のように、タスクは(いくつかの小さな例外を除いて)ホットとして返され、既に実行されています。これは、私の最近の質問Translating async-await C# code to F# with the scheduler and in related Orleansに関連しています (コンテキストを強化するためにいくつかのタグを追加します。他の誰かがこれらについても熟考している可能性があります)。
C# の用語で考えると、私が達成しようとしているのは、タスクの結果を待ってから戻ることですが、ブロックすることはありません。私が求めている動作は、特にawait
notの動作です.Result
。違いは、たとえば次のように読み取ることができます。
C# に関して、どのコンテキスト、スケジューラ、動作、または何かが起こっているかを考えようとするのは、私にとってはやや曖昧です。残念ながら、相互運用に関しては、すべての詳細を無視できないようです。:)