我已经使用ActionOnAsyncDispose结构实现了IAsyncDisposable。我的理解是,在async 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()) {
...
}
在这种情况下,我能避免装箱吗?我找不到有关我的using变量需要实现什么以产生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();
}
}
...
}
ConfiguredAsyncDisposable
已经被静态确定为结构体,所以不应该有问题。当变量声明类型为IAsyncDisposable
时,情况并非如此,因为运行时类型不是静态已知的。 - Charlieface