gpt4 book ai didi

c# - 如何为异步方法创建通用扩展方法?

转载 作者:行者123 更新时间:2023-12-05 00:47:43 24 4
gpt4 key购买 nike

我正在尝试创建一个 .WithDelay(seconds); 方法,我可以在异步方法调用的末尾添加该方法。

我得到的问题是首先调用异步方法然后延迟发生,我希望它反过来,而不切换调用的顺序。

例如,我想要 await MyMethod().WithDelay(seconds); 而不是 await WithDelay(seconds).MyMethod();

这是我目前所拥有的,它首先调用方法:

public async static Task<T> WithDelay<T>(this Task<T> task, int delay) {
await Task.Delay(delay);
return await task;
}

我希望延迟首先发生,然后才是实际运行的方法。

最佳答案

I want it the other way around, without switching the order of the call.

这是不可能的,因为 C# 语言只支持 types 的扩展方法,而不支持 methods

您可以获得的最接近的是委托(delegate)的扩展方法:

public static async Task<T> WithDelay<T>(this Func<Task<T>> func, int delay) {
await Task.Delay(delay);
return await func();
}

用法仍然很尴尬:

// Either:
Func<Task<MyType>> func = MyMethod;
var result = await func.WithDelay(1000);

// or (assuming "using static"):
var result = await WithDelay(MyMethod, 1000);

// What you really want, not currently possible:
// var result = await MyMethod.WithDelay(1000);

对于这种类型相关的情况,它可以帮助先同步解决问题,然后将该解决方案转换为 async。如果该语言阻碍了一个好的同步解决方案,那么它很可能会阻碍一个好的异步解决方案。

有一个proposal用于方法的扩展方法,但它现在不是语言的一部分。

关于c# - 如何为异步方法创建通用扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55594672/

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