我在各个地方看过ConfigureAwait(包括SO问题),以下是我的结论:
。配置等待(true)
。否则,由于另一个线程访问UI元素,将发生InvalidoperationException。我的问题是:
在应用程序代码中使用 ConfigureAwait(false)
通常不会以任何有意义的方式提高应用程序的性能,因为通常您不会在应用程序代码中等待
内部循环。例如,让我们考虑这样一种情况:你的应用有一个按钮,每次用户单击该按钮时都会启动一个异步操作,而异步操作包括一个 await
。通过键入 22 个字符 。ConfigureAwait(false)
在此等待
之后,您已经失去了生命中的可比时间,您希望从每分钟单击此按钮一次的10个用户中节省下来的时间,每天8小时,每个用户20年(总共约35,000,000次上下文切换=几秒的CPU处理时间)。
这在考虑您需要考虑是否可以安全地包含此配置的时间之前(取决于延续是否包含与UI相关的代码),每次必须维护/修改代码时重新确认之前的评估所需的时间,以及如果评估错误,您在调试时损失的时间。
另一方面,如果您的Button_Click
处理程序包含如下代码:
private async void Button_Click(object sender, EventArgs e)
{
var client = new WebClient();
using var stream = await client.OpenReadTaskAsync("someUrl");
var buffer = new byte[1024];
while ((await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
//...
}
}
...然后一定要花额外的时间来配置等待(假)ReadAsync
任务。还要考虑通过将流读取部分移动到单独的异步方法来重构代码,这样您就可以安全地访问Button_Click
处理程序中任何地方的UI元素,而不会被不属于应用程序这一层的技术问题分散注意力。
如果可用的工作线程不多,并且需要等待的线程经常处于忙碌状态,则< code > configurewait(false)可能会提高性能。
< code > configurea wait(false)在不需要返回到相同的SynchronizationContext(通常与thread链接)的任何地方都是推荐的,尤其是在内部等待某些东西的库中:https://medium . com/by nder-tech/c-why-you-should-use-configurea wait-false-in-your-library-code-d 7837 DCE 3d 7 f。
当您需要相同的上下文时,需要< code > configurewait(true)(这是默认值),但在某些情况下也可能导致死锁。
考虑以下代码:
void Main()
{
// creating a windows form attaches a synchronization context to the current thread
new System.Windows.Forms.Form();
var task = DoSth();
Console.WriteLine(task.Result);
}
async Task<int> DoSth()
{
await Task.Delay(1000);
return 1;
}
在此示例中,由于未等待任务 DoSth,主 UI 线程被等待任务所阻塞。结果 - 同时 DoSth 被阻止,因为它希望在延迟后返回到 UI 线程。这将导致死锁,并且此代码永远不会执行到最后。正在添加 .在这种情况下,ConfigureAwait(false)
解决了这个问题。
要更直接地回答您的问题:
ConfigureAwait(true):在运行Await之前,在同一线程上运行代码的剩余部分。
不一定是同一个线程,而是同一个同步上下文。同步上下文可以决定如何运行代码。在UI应用程序中,它将是同一个线程。在ASP。NET中,它可能不是同一个线程,但您将有<code>HttpContext</code>可用,就像之前一样。
配置等待(false):在运行等待代码的同一线程上运行其余代码。
这是不正确的。配置等待(false)
告诉它它不需要上下文,因此代码可以在任何地方运行。它可以是运行它的任何线程。
如果等待之后是访问UI的代码,则任务应附加。ConfigureAwait(true)
。否则,由于另一个线程访问UI元素,将发生InvalidOperationException。
它“应该附加。配置等待(true)
”是不正确的。配置等待(true)
是默认值。因此,如果这是您想要的,则无需指定它。
返回同步上下文可能需要时间,因为它可能需要等待其他东西完成运行。事实上,这种情况很少发生,或者等待时间很短,你根本不会注意到。
您可以使用< code > configurewait(false),但我建议您不要这样做,原因如下:
配置等待(false)
,延续可以在任何线程上运行,因此如果您访问非线程安全的对象,您可能会遇到问题。有这些问题并不常见,但它可能会发生。配置等待(false)
很容易被发现(它可能采用与抛出异常的方法不同的方法)并且您/他们知道它的作用。我发现根本不使用配置Await(假)
更容易(除了在库中)。用Stephen Toub(微软员工)在ConfigalAwait FAQ中的话来说:
编写应用程序时,通常需要默认行为(这就是为什么它是默认行为的原因)。
编辑:我写了一篇自己的关于这个话题的文章:。NET:不要使用configurewait(false)
我试图连接到Kafka使用汇流。Kafka包。但是,我需要使用jaas作为身份验证方法。我找不到使用融合的方法。Kafka为。NET. 编辑: 我收到以下数据连接: 我试图建立这样的联系: 你们知道我怎么设置收到的Jaas吗?
问题内容: 我是初学者,正在创建winform应用程序。在其中我必须使用API进行简单CRUD操作。我的客户与我共享了API,并要求以JSON形式发送数据。 API:http : //blabla.com/blabla/api/login-valida 关键字:“ HelloWorld” 值:{“电子邮件”:“ user@gmail.com”,“密码”:“ 123456”,“时间”:“ 201
我试着把这个项目作为一个正常的参考。但是在重新构建解决方案之后,控制台应用程序仍然没有将.NET核心库作为参考。
我通过使用PDFiumSharp将每页转换为PNG图像来打印PDF文件。接下来,我将此图像绘制为图形。 问题是打印机接收到的数据非常大,整个过程运行缓慢。我试图在Windows上使用lpr命令。它可以直接处理PDF文件,但我的应用程序需要支持双面打印、不同的纸张来源等,这在lpr中是不可用的。 如何使用System. Drawing. Printig(或其他提供类似功能的东西)打印PDF而不转换为
本文向大家介绍在.Net中使用MongoDB的方法教程,包括了在.Net中使用MongoDB的方法教程的使用技巧和注意事项,需要的朋友参考一下 什么是MongoDB MongoDB是基于文档的存储的(而非表),是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mong
我在一个Android/iOS应用程序中遇到了一个问题:库代码(libgdx?)抛出一个NPE,但不支持在RoboVM中调试。在Android中运行时,它的工作方式与预期一致,并会出现方法。在IOs中运行时,它将到达failed(Throwable t)方法,其中t是。我创建了一个示例应用程序来展示这个问题,也许是我的错,所以下面是代码: