C# 如何在F中实现具有返回任务(非泛型)方法的接口#
假设我有接口:C# 如何在F中实现具有返回任务(非泛型)方法的接口#,c#,f#,task-parallel-library,async-await,c#-to-f#,C#,F#,Task Parallel Library,Async Await,C# To F#,假设我有接口: interface IProductRepository { Task SaveProduct(Product p); } 以前由C#类实现: 现在我想在F#中实现同样的功能: 但是得到一个错误(1): 此表达式应具有类型Task,但此处具有类型Async 您需要使用async.startask启动async工作流,但遗憾的是,这在这里不起作用,因为这需要一个通用任务task,因为任务 类型Db= 抽象产品:System.Collections.Generic.ICol
interface IProductRepository
{
Task SaveProduct(Product p);
}
以前由C#类实现:
现在我想在F#中实现同样的功能:
但是得到一个错误(1):
此表达式应具有类型Task,但此处具有类型Async
您需要使用
async.startask
启动async
工作流,但遗憾的是,这在这里不起作用,因为这需要一个通用任务task,因为任务
类型Db=
抽象产品:System.Collections.Generic.ICollection
抽象SaveProductAsync:product:product->Task
类型存储库(db:db)=
IProductRepository与的接口
成员this.SaveProduct(p:Product)=
db.Products.Add(p)
上传db.SaveProductAsync(p)
@abatishchev yes-很抱歉,它没有看到它返回了Async
,但是与C#实现相比,它的效率如何?糟糕的不是吗?等等,我刚刚看到awaiiasyncresult
不起作用-您需要AwaitWaitHandle
-我会将其更改为更好地处理任务,而不使用返回类型。@abatishche在性能方面是否有效?问题是,为什么首先要将其放入一个async
-您可以添加p
,然后返回任务db.savechangessync()
返回-但C版本也是如此
class CSharpProductRepository : IProductRepository
{
public Task SaveProduct(Product p)
{
_db.Products.Add(p);
return _db.SaveChangesAsync();
}
}
type FSharpProductRepository =
interface IProductRepository with
member this.SaveProduct(p : Product) : Task = this.SaveProduct(p) // error 1
member this.SaveProduct(p : Product) = async {
db.Products.Add(p)
return db.SaveChangesAsync() |> Async.AwaitTask // error 2
}
type FSharpProductRepository =
interface IProductRepository with
member this.SaveProduct(p : Product) : Task =
this.SaveProduct(p)
member this.SaveProduct(p : Product) =
async {
db.Product.Add(p)
let task = db.SaveChangesAsync()
let! _ = Async.AwaitWaitHandle (task :> IAsyncResult).AsyncWaitHandle
return ()
} |> Async.StartAsTask :> _
member this.SaveProduct(p : Product) =
db.Product.Add(p)
db.SaveChangesAsync()
open System.Threading.Tasks
// stubs since I don't know what the actual code looks like
type Product = class end
type IProductRepository =
abstract SaveProduct: product: Product -> Task
type Db =
abstract Products: System.Collections.Generic.ICollection<Product>
abstract SaveProductAsync: product: Product -> Task<int>
type Repository(db: Db) =
interface IProductRepository with
member this.SaveProduct(p: Product) =
db.Products.Add(p)
upcast db.SaveProductAsync(p)