En general, no se recomienda exponer los tipos F # como FSharpAsync
en una interfaz pública que será utilizada por los clientes C# (consulte F# component design guidelines). Puede usar Async.StartAsTask
(en el lado F #) para exponer la operación como Task<T>
que es fácil de usar desde C#.
De hecho, también reemplazaría la tupla por un tipo con nombre (que captura el significado de la estructura de datos). Tuplas se pueden utilizar en C#, pero no son idiomática en C#:
// Assuming you have an operation like this
let asyncDoWork() : Async<seq<DateTime * string>> = (...)
// Define a named type that explains what the date-string pair means
type Item(created:DateTime, name:string) =
member x.Created = created
member x.Name = name
// Create a simple wrapper that wraps values into 'Item' type
let asyncDoWorkItems() =
async { let! res = asyncDoWork()
return seq { for (d, n) in res -> Item(d, n) } }
Ahora, para exponer la operación a C#, lo mejor es utilizar un tipo con un método estático sobrecargado. El método inicia la operación como una tarea y una sobrecarga especifica el token de cancelación. La convención de nombres de C# para éstos es agregar Async
hasta el final del nombre (que no se solapa con F # que añade Async
al frente):
type Work =
static member DoWorkAsync() =
Async.StartAsTask(asyncDoWorkItems())
static member DoWorkAsync(cancellationToken) =
Async.StartAsTask(asyncDoWorkItems(), cancellationToken = cancellationToken)
Su código C# puede entonces utilizar Work.DoWorkAsync()
y el trabajo con la tarea en el estilo habitual de C#. Incluso va a trabajar con el await
palabra clave que será (probablemente) que se añade a C# 5.
Personalmente, no prefiero exponer los tipos de datos FSharp como FSharpAsync en una biblioteca escrita en F #. ¿Podría publicar el código F # para que podamos proponer una mejor manera de exponer la biblioteca Fsharp – Ankur