非异步方法将对单流调用抛出异步

NonAsync method going throw Async for single flow calls

我正在创建一个包含多种方法的 .NET Standard 库,每种方法都有常规版本和异步版本。

例如,一种方法是:

public static int DoSomethingOne(string value) { ... }
public static async Task<int> DoSomethingOneAsync(string value) { ... }

现在他们正在做一些字符串操作,还用 EF 函数调用 DB。

目前我在完全独立的流程中拥有这些方法,但我已经看到内部方法的示例被加入意味着非异步将以 if 条件抛出异步并返回 .GetAwaiter().GetResult();
这种方法看起来比较干,没有双重代码。

所以问题是:该结构有效还是我应该坚持使用单独的流程?

另请注意,我在共享方法中已经有一些逻辑段是异步不可知的,但仍然有一些代码是双倍的,比如调用那些共享方法和其他几行代码。

扩展示例:

  1. 目前有:
public static int DoSomethingOne(string value)
{
    return DoSomethingOneInternal(value);
}

public static async Task<int> DoSomethingOneAsync(string value, CancellationToken cancellationToken)
{
    return await DoSomethingOneInternalAsync(value, cancellationToken).ConfigureAwait(false);
}

private static int DoSomethingOneInternal(string value)
{
    var input = DoStringChangeOne(value);
    CallDbOne(input);
    var output = DoStringChangeTwo(input);
    var count = CallDbTwo(output);

    return count;
}

private static async Task<int> DoSomethingOneInternalAsync(string value, CancellationToken cancellationToken) { ... }
{
    var input = DoStringChangeOne(value);
    await CallDbOneAsync(input).ConfigureAwait(false);
    var output = DoStringChangeTwo(input);
    var count = await CallDbTwoAsync(output).ConfigureAwait(false);

    return count;
}
  1. 或者可以这样写:
public static int DoSomethingOne(string value) 
{
    return DoSomethingOneInternalAsync(value, null, isAsync: false).GetAwaiter().GetResult();
}

public static async Task<int> DoSomethingOneAsync(string value, CancellationToken cancellationToken) 
{
    return await DoSomethingOneInternalAsync(value, cancellationToken, isAsync: true).ConfigureAwait(false);
}

private static int DoSomethingOneInternalAsync(string s, CancellationToken? cancellationToken, bool isAsync)
{
    var input = DoStringChangeOne(value);

    if(isAsync) {
        await CallDbOneAsync(input).ConfigureAwait(false);
    }
    else {
        CallDbOne(input);
    }
    var output = DoStringChangeTwo(input);
    var count = isAsync ? await CallDbTwoAsync(output).ConfigureAwait(false) : CallDbTwo(output);

    return count;
}

现在大约有 10 个这样的方法,它们有 2 到 4 个深度级别调用内部子方法以获得更好的结构。
另外要补充的是,异步版本是 'main' 版本,并且更常用于说明为什么它们具有直接流,而不经常使用非异步版本,因此它们在选项 2 中被重定向。

is that structure valid or should I stick to separate flow?

valid。是否应该使用它取决于您。 “boolean argument hack”的好处是你的代码是干的——特别是,这意味着如果有一个错误修复应用于一个方法,那么同步和异步版本总是得到那个错误修复。但如果这些都是相对较小的方法,那么额外的样板可能不值得。