- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在编写大量 async
库代码,并且我知道在每次异步调用之后添加 ConfigureAwait(false)
的做法,以便避免将延续代码编码回原始(通常是 UI)线程上下文。由于我不喜欢未标记的 bool 参数,因此我倾向于将其写为 ConfigureAwait(continueOnCapturedContext: false)
。
我添加了一个扩展方法以使其更具可读性(并减少了输入):
public static class TaskExtensions
{
public static ConfiguredTaskAwaitable<TResult> WithoutCapturingContext<TResult>(this Task<TResult> task)
{
return task.ConfigureAwait(continueOnCapturedContext: false);
}
public static ConfiguredTaskAwaitable WithoutCapturingContext(this Task task)
{
return task.ConfigureAwait(continueOnCapturedContext: false);
}
}
所以现在我可以用 await SomethingAsync().WithoutCapturingContext()
代替 await SomethingAsync().ConfigureAwait(continueOnCapturedContext: false)
。我认为这是一个改进,但是当我不得不在同一个代码块中调用多个 async
方法时,即使这样也开始感到厌烦,因为我最终得到的结果与此类似:
await FooAsync().WithoutCapturingContext();
var bar = await BarAsync().WithoutCapturingContext();
await MoreFooAsync().WithoutCapturingContext();
var moreBar = await MoreBarAsync().WithoutCapturingContext();
// etc, etc
在我看来,它开始降低代码的可读性。
我的问题基本上是这样的:有没有办法进一步减少它(除了缩短扩展方法的名称)?
最佳答案
没有全局设置来阻止方法中的任务捕获同步上下文,但是您可以做的是仅更改该方法范围内的同步上下文。在您的特定情况下,您可以仅针对该方法的范围将上下文更改为默认同步上下文。
编写一个简单的一次性类来更改同步上下文然后在处理时将其更改回来是很容易的:
public class SyncrhonizationContextChange : IDisposable
{
private SynchronizationContext previous;
public SyncrhonizationContextChange(SynchronizationContext newContext = null)
{
previous = SynchronizationContext.Current;
SynchronizationContext.SetSynchronizationContext(newContext);
}
public void Dispose()
{
SynchronizationContext.SetSynchronizationContext(previous);
}
}
允许你写:
using(var change = new SyncrhonizationContextChange())
{
await FooAsync();
var bar = await BarAsync();
await MoreFooAsync();
var moreBar = await MoreBarAsync();
}
(注意将上下文设置为 null
意味着它将使用默认上下文。)
关于c# - 是否有比在异步方法中调用 ConfigureAwait(false) 更具可读性的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27109285/
我的按钮有问题。该按钮是登录按钮。当我在输入凭据后单击回车时,将触发查看凭据是否正确的方法。这没有任何问题。 但还应该发生的是,在检查这些凭据是否正确之后,登录和注册按钮应该会被删除,同时会出现一个新
因此,我尝试以 Angular 显示多个 View ,以帮助解决我正在构建的网站中遇到的页脚问题。我想确保我一直在阅读和尝试模仿的内容是有意义的。这就是我到目前为止所拥有的。 index.html
我正在尝试创建可调整大小的 div 容器,而且它们是可拖动的。 我使用了 Angular Material 拖放和 angular resizable element 这是解决方法 https://s
我正在尝试创建可调整大小的 div 容器,而且它们是可拖动的。 我使用了 Angular Material 拖放和 angular resizable element 这是解决方法 https://s
我是一名优秀的程序员,十分优秀!