重构 2 个相同的函数,它们分别接收回调函数 Func<Task<T>> 和 Func<T>

Refactoring 2 identical functions which receive a callback Func<Task<T>> and Func<T> respectively

public static async Task<T> NDC<T>(Func<Task<T>> func)
{
    using (SomeDisposable())
    {
        try
        {
            return await func();
        }
        catch (Exception ex)
        {
            Console.WriteLine("error");

            throw;
        }
    }
}

public static T NDC<T>(Func<T> func)
{
    using (SomeDisposable())
    {
        try
        {
            return func();
        }
        catch (Exception ex)
        {
            Console.WriteLine("error");

            throw;
        }
    }
}

如您所见,这两个功能几乎相同。它们之间的唯一区别是,当回调是 Func<Task<T>> 时,它将被等待,因此 return 类型是 Task<T>,否则,函数将 return输入 T.

我想group/generic这些功能,有什么办法可以实现吗?提前致谢。

P.S。如果调用者调用了非任务版本,则此函数中的所有进程都应 运行 在单个线程中。

您可以从异步版本导出同步版本,如下所示:

public static T NDC<T>(Func<T> func)
{
    if (func == null) throw new ArgumentNullException(nameof(func));
    return NDC(() => Task.FromResult(func())).GetAwaiter().GetResult();
}

有两个陷阱:

  1. 您无法通过仅使用一种方法进行参数验证来摆脱困境。您必须在两个 NDC 方法中验证 func 参数。除非您使用可空引用类型,如评论中的 Alexei Levenkov

  2. 此解决方案仅在 await func(); 是异步 NDC 方法中唯一等待的操作时才有效。否则当前线程将被阻塞,并且会发生不好的事情(可伸缩性下降或死锁,具体取决于应用程序的类型)。