- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑以下代码:
private static async Task Main(string[] args)
{
await SetValueInAsyncMethod();
PrintValue();
await SetValueInNonAsyncMethod();
PrintValue();
}
private static readonly AsyncLocal<int> asyncLocal = new AsyncLocal<int>();
private static void PrintValue([CallerMemberName] string callingMemberName = "")
{
Console.WriteLine($"{callingMemberName}: {asyncLocal.Value}");
}
private static async Task SetValueInAsyncMethod()
{
asyncLocal.Value = 1;
PrintValue();
await Task.CompletedTask;
}
private static Task SetValueInNonAsyncMethod()
{
asyncLocal.Value = 2;
PrintValue();
return Task.CompletedTask;
}
如果您在 .NET 4.7.2 控制台应用程序中运行此代码,您将获得以下输出:
SetValueInAsyncMethod: 1
Main: 0
SetValueInNonAsyncMethod: 2
Main: 2
我明白输出的不同是因为 SetValueInAsyncMethod
实际上不是一个方法,而是由 AsyncTaskMethodBuilder
执行的状态机,它捕获 ExecutionContext
内部和 SetValueInNonAsyncMethod
只是一个常规方法。
但即使有了这样的理解,我仍然有一些问题:
AsyncLocal
的代码时,我是否需要担心这种行为?比如说,我想编写我的 TransactionScope
-wannabe,它可以通过等待点传输一些环境数据。 AsyncLocal
在这里够了吗?AsyncLocal
和 CallContext.LogicalGetData
/CallContext.LogicalSetData
是否还有其他替代方案“逻辑代码流”?最佳答案
Is this a bug / missing feature or an intentional design decision?
这是一个有意的设计决定。具体来说,async
状态机为其逻辑上下文设置“写入时复制”标志。
与此相关的是所有同步 方法都属于它们最近的祖先 async
方法。
Do I need to worry about this behavior while writing code that depends on AsyncLocal? Say, I want to write my TransactionScope-wannabe that flows some ambient data though await points. Is AsyncLocal enough here?
像这样的大多数系统使用 AsyncLocal<T>
结合 IDisposable
清除 AsyncLocal<T>
的模式值(value)。组合这些模式可确保它适用于同步或异步代码。 AsyncLocal<T>
如果消费代码是 async
,它自己会正常工作方法;与 IDisposable
一起使用确保它适用于 async
和同步方法。
Are there any other alternatives to AsyncLocal and CallContext.LogicalGetData / CallContext.LogicalSetData in .NET when it comes down to preserving values throughout the "logical code flow"?
没有。
关于c# - ExecutionContext 不会从异步方法向上流动调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55480137/
我有一个 .Net Framework 控制台应用程序,可以在 Azure 中成功将其发布为 WebJob 并查看它的运行情况。当我尝试向函数添加 ExecutionContext 参数时,我收到上述
我有以下测试用例: test("test future") { import scala.concurrent.ExecutionContext.global import scala
ExecutionContext 可用于函数参数。 但是,它不能通过依赖注入(inject)供其他方法使用,包括 Functions 的构造函数,如下所示: public class Func
ExecutionContext 可用于函数参数。 但是,它不能通过依赖注入(inject)供其他方法使用,包括 Functions 的构造函数,如下所示: public class Func
有人知道 ExecutionContext.Capture() 和 ExecutionContext.Run(context, work, state) 是否很昂贵吗? 它是否会降低性能,因此建议谨慎
我想知道哪个ExecutionContext我应该在 scalatest % 2.2.6 上使用(以及为什么)运行我的 future 并模拟 future 。 class Foo { def f
我一直在开发一个中小型 Web 应用程序,大约有 10 个端点。它应该可以同时处理数百个并发请求。 由于我公司的政策,我必须为我的 Controller 使用 javax.ws.rs,所以每个 Con
我有以下代码: object KafkaApi { private implicit val main: ExecutionContextExecutor = ExecutionContext.g
考虑以下代码: private static async Task Main(string[] args) { await SetValueInAsyncMethod(); Print
在每个方法中传递 ExecutionContext 是否更符合 Scala 习惯,例如 class Foo { def bar(a: Int, b: Int)(implicit ec: Exe
我试图发现 ExecutionContext实际上适用于 .NET Framework 4.0 及更高版本。文档说,在使用 Thread.Start 和大多数线程池操作时,托管原则、同步、区域设置和用
假设我想知道给定 ExecutionContext 中有多少个线程. 所以我正在写一个这样的函数 def count(implicit ec: ExecutionContext): Int = {
我知道,当您通过调用 BeginInvoke() 或 ThreadPool.QueueUserWorkItem(...) 并行运行某些方法时,.NET 框架正在捕获包含代码访问安全信息和其他一些内容的
在 scala 中使用 future 时,默认行为是使用默认的 Implicits.global 执行上下文。看来这默认为每个处理器提供一个可用线程。在更传统的线程 Web 应用程序中,当 futur
我有一个 Spring 批处理作业,它使用如下 Web 参数执行: https://localhost:8443/batch/async/orz003A?id=123&name=test 我已将这些参
我希望将隐式 ExecutionContext 传递给部分实现的特征。 在代码示例中: import scala.concurrent.Future trait Processor[T,R] {
我正在使用 Scala 2.10 future 创建一个异步库。库的构造函数采用一系列实现特定特征的用户定义对象,然后库类上的方法将一些数据逐个发送到用户定义对象中。我希望用户提供ExecutionC
这是一个相当笼统的问题,但希望是一个合理的问题。什么时候ExecutionContext#reportFailure(Throwable)叫? Scala 标准库中似乎没有调用它。我想我也许应该在某些
当我制作 future ,或应用类似 onSuccess 的方法和 map ,我可以为它们指定 ExecutionContext 。 例如, val f = future { // code }
我有这两个错误: Error:(39, 20) Cannot find an implicit ExecutionContext. You might pass an (implicit ec: Ex
我是一名优秀的程序员,十分优秀!