jjzjj

SynchronizationContext

全部标签

[翻译]ExecutionContext vs SynchronizationContext

我最近几次被问到关于ExecutionContext和SynchronizationContext的各种问题,例如它们之间的区别是什么,“传播(Flow)”它们意味着什么,以及它们与C#和VisualBasic中新的async/await关键字的关系。我想我会尝试在这里解决其中的一些问题。警告:这篇文章深入到.NET的一个高级领域,大多数开发人员永远不需要考虑。什么是ExecutionContext,使它“传播”是什么含义?ExecutionContext是绝大部分开发人员不需要考虑的事情之一。它有点像空气:它存在很重要,但除非在某些关键时刻(例如当它出了问题时),我们才会想到它的存在。实际上

c# - 'context' 在 C# async/await 代码中到底意味着什么?

让我们看一些简单的C#async/await代码,其中我在使用ConfigureAwait(false)await之前和之后有一个对象引用(obj)/privateasyncTaskAnAsyncLibraryMethod(SomeObjectobj){Console.WriteLine(Thread.CurrentThread.ManagedThreadId);obj.Name="Harry";//ConfigureAwait(false)似乎意味着不将延续编码回捕获的原始上下文-好的,但这到底是什么意思?我已经尝试了上面的代码并且objIS被正确引用回来(即使它在不同的线程上恢复)

c# - 'context' 在 C# async/await 代码中到底意味着什么?

让我们看一些简单的C#async/await代码,其中我在使用ConfigureAwait(false)await之前和之后有一个对象引用(obj)/privateasyncTaskAnAsyncLibraryMethod(SomeObjectobj){Console.WriteLine(Thread.CurrentThread.ManagedThreadId);obj.Name="Harry";//ConfigureAwait(false)似乎意味着不将延续编码回捕获的原始上下文-好的,但这到底是什么意思?我已经尝试了上面的代码并且objIS被正确引用回来(即使它在不同的线程上恢复)

c# - nunit 如何成功等待 async void 方法完成?

在C#中使用async/await时,一般规则是避免使用asyncvoid,因为这几乎是一劳永逸,而不是一个任务。说得通。奇怪的是,本周早些时候我正在为我编写的一些async方法编写一些单元测试,并注意到NUnit建议将async测试标记为void或返回Task。然后我尝试了一下,果然,它起作用了。这看起来真的很奇怪,因为nunit框架如何能够运行该方法并等待所有异步操作完成?如果它返回Task,它可以等待任务,然后做它需要做的事情,但是如果它返回void,它如何完成它呢?于是我破解了源码,找到了。我可以在一个小样本中重现它,但我根本无法理解他们在做什么。我想我不太了解Synchron

c# - nunit 如何成功等待 async void 方法完成?

在C#中使用async/await时,一般规则是避免使用asyncvoid,因为这几乎是一劳永逸,而不是一个任务。说得通。奇怪的是,本周早些时候我正在为我编写的一些async方法编写一些单元测试,并注意到NUnit建议将async测试标记为void或返回Task。然后我尝试了一下,果然,它起作用了。这看起来真的很奇怪,因为nunit框架如何能够运行该方法并等待所有异步操作完成?如果它返回Task,它可以等待任务,然后做它需要做的事情,但是如果它返回void,它如何完成它呢?于是我破解了源码,找到了。我可以在一个小样本中重现它,但我根本无法理解他们在做什么。我想我不太了解Synchron

c# - 在同步方法中使用 Task.Run() 以避免死锁等待异步方法?

UPDATE这个问题的目的是获得关于Task.Run()和死锁的简单答案。我非常理解不混合异步和同步的理论推理,并将它们牢记在心。我不甘于向他人学习新事物;我会尽可能地这样做。有时候,一个人所需要的只是一个技术答案...我有一个Dispose()方法需要调用异步方法。由于我95%的代码是异步的,因此重构不是最佳选择。拥有框架支持的IAsyncDisposable(以及其他功能)将是理想的,但我们还没有做到这一点。因此,与此同时,我需要找到一种可靠的方法来从同步方法调用异步方法而不会出现死锁。我宁愿不使用ConfigureAwait(false),因为这使得责任分散在我的代码中,让被调用

c# - 在同步方法中使用 Task.Run() 以避免死锁等待异步方法?

UPDATE这个问题的目的是获得关于Task.Run()和死锁的简单答案。我非常理解不混合异步和同步的理论推理,并将它们牢记在心。我不甘于向他人学习新事物;我会尽可能地这样做。有时候,一个人所需要的只是一个技术答案...我有一个Dispose()方法需要调用异步方法。由于我95%的代码是异步的,因此重构不是最佳选择。拥有框架支持的IAsyncDisposable(以及其他功能)将是理想的,但我们还没有做到这一点。因此,与此同时,我需要找到一种可靠的方法来从同步方法调用异步方法而不会出现死锁。我宁愿不使用ConfigureAwait(false),因为这使得责任分散在我的代码中,让被调用

c# - 主线程的 SynchronizationContext.Current 如何在 Windows 窗体应用程序中变为 null?

我的应用程序出现问题:在某些时候,主线程的SynchronizationContext.Current变为null。我无法在一个孤立的项目中重现同样的问题。我的真实项目很复杂;它混合了Windows窗体和WPF并调用WCFWeb服务。据我所知,这些都是可能与SynchronizationContext交互的系统。这是我的独立项目的代码。我真正的应用程序做了类似的事情。但是,在我的真实应用程序中,当执行延续任务时,主线程上的SynchronizationContext.Current为null。privatevoidbutton2_Click(objectsender,EventArgs

c# - 主线程的 SynchronizationContext.Current 如何在 Windows 窗体应用程序中变为 null?

我的应用程序出现问题:在某些时候,主线程的SynchronizationContext.Current变为null。我无法在一个孤立的项目中重现同样的问题。我的真实项目很复杂;它混合了Windows窗体和WPF并调用WCFWeb服务。据我所知,这些都是可能与SynchronizationContext交互的系统。这是我的独立项目的代码。我真正的应用程序做了类似的事情。但是,在我的真实应用程序中,当执行延续任务时,主线程上的SynchronizationContext.Current为null。privatevoidbutton2_Click(objectsender,EventArgs

c# - 我为什么要费心使用 Task.ConfigureAwait(continueOnCapturedContext : false);

考虑以下窗口窗体代码:privateasyncvoidUpdateUIControlClicked(objectsender,EventArgse){this.txtUIControl.Text="Iwillbeupdatedafterawait-ihope!";awaitTask.Delay(5000).ConfigureAwait(continueOnCapturedContext:false);this.txtUIControl.Text="Iamupdatednow.";}这里在第3行抛出异常,因为在await之后代码在非UI线程上执行。ConfigureAwait(false