ConfigureAwait(false) и структурная реализация IAsyncDisposable

Я реализовал IAsyncDisposable со структурой ActionOnAsyncDispose, как показано ниже. Насколько я понимаю, компилятор не упакует его, когда он находится в асинхронном операторе using:

      ActionOnDisposeAsync x = ...;
await using (x) {
     ...
}

Правильный? Все идет нормально. Мой вопрос заключается в следующем: когда я настраиваю ожидание на нем так:

      ActionOnDisposeAsync x = ...;
await using (x.ConfigureAwait()) {
     ...
}

будет ли x упакован? А если я поставлю ConfigureAwait в метод Caf():

      [MethodImpl(MethodImplOptions.AggressiveInlining)]
static public ConfiguredAsyncDisposable Caf(this ActionOnDisposeAsync disposable)
    => disposable.ConfigureAwait(false);

ActionOnDisposeAsync x = ...;
await using (x.Caf()) {
     ...
}

Могу ли я избежать бокса в этом случае? Мне не удалось найти документацию о том, что именно нужно реализовать моей используемой переменной, чтобы иметь эффект ConfigureAwait. Также не существует общедоступного способа создания ConfiguredAsyncDisposable.

Вот ActionOnDisposeAsync:

      public readonly struct ActionOnDisposeAsync : IAsyncDisposable, IEquatable<ActionOnDisposeAsync>
{
    public ActionOnDisposeAsync(Func<Task> actionAsync)
    {
        this.ActionAsync = actionAsync;
    }
    public ActionOnDisposeAsync( Action actionSync)
    {
        this.ActionAsync = () => { actionSync(); return Task.CompletedTask; };
    }
    private Func<Task> ActionAsync { get; }

    public async ValueTask DisposeAsync()
    {
        if (this.ActionAsync != null) {
            await this.ActionAsync();
        }
    }

    ...
}

0 ответов

Другие вопросы по тегам