Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在F中实现具有返回任务(非泛型)方法的接口#_C#_F#_Task Parallel Library_Async Await_C# To F# - Fatal编程技术网

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)