gpt4 book ai didi

c# - 将异步 lambda 表达式转换为委托(delegate)类型 System.Func

转载 作者:IT王子 更新时间:2023-10-29 04:25:00 26 4
gpt4 key购买 nike

我在具有此签名的可移植类库中有一个异步方法:

private async Task<T> _Fetch<T>(Uri uri)

它获取一个资源,该资源被转换为具体类型 T。

我正在使用需要 Func<T> 的第三方缓存库 ( Akavache)作为参数之一,并尝试以这种方式这样做:

await this.CacheProvider.GetOrCreateObject<T>(key,
async () => await _Fetch<T>(uri), cacheExpiry);

这会导致错误:

Cannot convert async lambda expression to delegate type 'System.Func<T>'. An async lambda expression may return void, Task or Task<T>, none of which are convertible to 'System.Func<T>'.

我尝试了 Func<T> 的各种排列分配没有任何运气,我能让代码工作的唯一方法是制作 Func<T>阻塞:

await this.CacheProvider.GetOrCreateObject<T>(key, 
() => _Fetch<T>(uri).Result, cacheExpiry);

这让我的应用陷入僵局。

关于我误入歧途的任何指示?

最佳答案

没有办法。当有人期待 Func<T> f你可以假设它将被类似 result = f() 的东西调用- 即,它不知道异步行为。如果你使用 .Result 欺骗它就像你一样,它在 UI 线程上死锁,因为它想在 await 之后安排代码。 (在 _Fetch 中)在 UI 线程上,但您已经用 .Result 阻止了它.

异步 ​​lambda 可以传递给 Action因为它没有返回值 - 或者到 Func<Task>Func<Task<T>> .

看看你的情况,GetOrCreateObject似乎在调用 GetOrFetchObject . GetOrFetchObject之一重载接受 Func<Task<T>> .您可以尝试使用异步 lambda 调用该方法,看看是否有帮助。

关于c# - 将异步 lambda 表达式转换为委托(delegate)类型 System.Func<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com