有人遇到过使用ConfigureAwait(true)
的场景吗?由于true
是默认选项,我无法看出何时会使用它。
ConfigureAwait(true)
的情况吗?因为true
是默认选项,所以我看不出什么情况下会用到它。有人遇到过使用ConfigureAwait(true)
的场景吗?由于true
是默认选项,我无法看出何时会使用它。
ConfigureAwait(true)
的情况吗?因为true
是默认选项,所以我看不出什么情况下会用到它。如果设置为 true,则尝试将续订返回到原始捕获的上下文;否则为 false。
实际上,可以将 ConfigureAwait(true)
看作是使用 .ContinueWith( t => {...}, TaskScheduler.FromCurrentSynchronizationContext())
,而 ConfigureAwait(false)
则相当于使用 .ContinueWith( t => {...})
。如果传递 false,则续订将在线程池线程上运行,而不是返回到当前同步上下文。
我能看到的一种可能性是,如果你正在一个库中编写代码,而你希望允许调用者决定是否在原始上下文1上继续(尽管我通常会建议从库代码内部永远不要在原始上下文上继续执行)。
你的调用者将传递一个布尔参数或设置某些配置值,因此在运行时你将不知道正确的参数值是什么。
对于这种具有无参数变体和单参数变体的API的一般类型答案是,如果无法在运行时确定正确的值,则应使用具有正确运行时值的单参数变体直接调用它。无参数变体被记录为“与具有众所周知的值x的单参数变体相同”。
1例如,你的调用者也提供了一个委托。你的调用者将知道(并且可以决定)该委托是否需要回到原始上下文中。
.ConfigureAwait(true)
是一个现实世界的例子。 - mountain travellerConfigureAwait(boolVariable)
пјҢиҝҷжҳҜеҫҲеҘҪзҡ„гҖӮдҪҶеҺҹй—®йўҳжҳҜжҳҜеҗҰжңүзҗҶз”ұжү§иЎҢConfigureAwait(true)
пјҢеӣһзӯ”дјјд№ҺжҳҜеҗҰе®ҡзҡ„гҖӮ - BVernonTask ShowMessageBox(...)
方法,它会等待用户关闭对话框。如果我不得不在所有这些方法上添加ConfigureAwait
修饰符,那将非常奇怪。同样,包装所有这样的方法也是不合理的。 - JohnConfigureAwait(true)
:ConfigureAwait(true)
的情况是在锁定中执行await,或使用其他上下文/线程特定资源时。这需要一个同步上下文,除非您正在使用Windows Forms或WPF,否则您将需要创建它们自己的UI同步上下文。ConfigureAwait(false)
,则锁定会尝试在不同的线程上释放,导致异常。这是一个简单的示例,如果外部源更改了大型配置文件,则尝试更新它,以避免磁盘IO的写操作,如果配置文件与之前相同。/// <summary>
/// Write a new config file
/// </summary>
/// <param name="xml">Xml of the new config file</param>
/// <returns>Task</returns>
public async Task UpdateConfig(string xml)
{
// Ensure valid xml before writing the file
XmlDocument doc = new XmlDocument();
using (XmlReader xmlReader = XmlReader.Create(new StringReader(xml), new XmlReaderSettings { CheckCharacters = false }))
{
doc.Load(xmlReader);
}
// ReaderWriterLock
configLock.AcquireReaderLock(Timeout.Infinite);
try
{
string text = await File.ReadAllTextAsync(ConfigFilePath).ConfigureAwait(true);
// if the file changed, update it
if (text != xml)
{
LockCookie cookie = configLock.UpgradeToWriterLock(Timeout.Infinite);
try
{
// compare again in case text was updated before write lock was acquired
if (text != xml)
{
await File.WriteAllTextAsync(ConfigFilePath, xml).ConfigureAwait(true);
}
}
finally
{
configLock.DowngradeFromWriterLock(ref cookie);
}
}
}
finally
{
configLock.ReleaseReaderLock();
}
}
如果您正在使用Azure的Durable Functions,则在等待Activity函数时必须使用ConfigureAwait(true)
:
string capture = await context.CallActivityAsync<string>("GetCapture", captureId).ConfigureAwait(true);
ConfigureAwait(true)
的作用,但并没有解释何时有人想要使用它。能否提供一些例子,使人们知道何时需要.ConfigureAwait(true)
。它是否相当于根本不调用.ConfigureAwait()
,或避免使用.ConfigureAwait()
将使代码随机使用或不使用当前上下文?例如,为什么有人需要在ASP.NET MVC应用程序中使用同步上下文? - Alisson Reinaldo Silva