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();
}
}
...
}