使用委托 Func<T,T 的异步声明>

Asynchronous declaration with delegate Func<T,T>

提问人:Nevir 提问时间:4/6/2023 最后编辑:Theodor ZouliasNevir 更新时间:4/7/2023 访问量:80

问:

我试着声明这一点:

public static async Task<T> ReadAsync<T>(Func<T,T> read)
{
    return await Task.Run(read);
}

我有一个错误:

参数 1:无法从“System.Func<T, T>”转换为“System.Action”

我无法修复它。 我尝试过这个,但也有一个错误:“T”是一种类型,在给定的上下文中无效

public static async Task<T> ReadAsync<T>(Func<T,T> read)
{
    return await Task.Run(read(T));
}
c# 异步 async-await task-parallel-library

评论

1赞 Ralf 4/6/2023
你无法获得需要放入读取调用的值,你在这里没有它。也可以将应放入读取调用的内容也作为另一个参数放入 ReadAsync 签名中,或者将签名更改为仅采用 Func<T> 并在调用函数中处理输入参数。
0赞 Peter Csala 4/6/2023
您能告诉我们这种方法的主要目的是什么吗?你到底想用它实现什么?感觉确实这是一个 XY 问题ReadAsync
0赞 Theodor Zoulias 4/7/2023
您能否在问题中举例说明您打算如何使用该方法?ReadAsync
0赞 Nevir 4/7/2023
public async Task<int> ReadAsync(byte[] buffer) { return await SerialPortLb.ReadAsync((byte[] b,int) => { return _port.读取(b, 0, b.长度);});}
0赞 Nevir 4/7/2023
我想编写一个任务返回 int 值和 func<byte[],int>我的 lambda 有问题

答:

2赞 Guru Stron 4/6/2023 #1

Func<T,TResult> 是一个代表一个接受单个参数并返回的函数的委托,所以是一个接受单个参数并返回相同类型值的函数,可以是一个很好的例子。TTResultFunc<T, T>Func<int, int> myFunc = i => i + 1;

Task.Run 有几个重载,它们都没有委托接受参数,它要么是 Action 委托(不接受任何参数,也不返回任何内容)或(或处理异步函数,但同样 - 没有参数,只有返回值)。此外,通常您需要从“另一种类型”中读取值。因此,您有以下选择:Func<TResult>Func<Task<TResult>>

  1. 提供无参数委托(尽管在这种具体情况下没有多大意义):

    static Task<T> ReadAsync<T>(Func<T> read) => Task.Run(read);
    

    用法如下ReadAsync(() => myValueHolder.GetValue())

  2. 使用 2 个通用参数并为第一个参数提供实例(也可以是扩展方法):

    static Task<TResult> ReadAsync<T, TResult>(T valueHolder, Func<T, TResult> read) 
         => Task.Run(() => read(valueHolder));
    
  3. 如果你的方法有 valueHolder 可用 - 删除第一个参数,尽管用法需要传递两个泛型参数:ReadAsync

    static async Task<TResult> ReadAsync<T, TResult>(Func<T, TResult> read)
    {
        T valueHolder = ...;
        return await Task.Run(() => read(valueHolder));
    }
    

    和用法ReadAsync<SomeType, SomeResult>(t => t.GetValue())

笔记: