问题标签 [valuetask]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 等待带有 ValueTask 的单个 .NET 事件
我有一个简单的ITimer
界面,它只有一个经典的Elapsed
.NET 事件,该事件在某个时间跨度后引发。
现在我想创建一个类似于Task.Delay(TimeSpan)
但它应该使用该ITimer
抽象而不是“实时”时间的功能。Task.Delay(TimeSpan)
尽管返回 aValueTask
而不是 a可能是一个好主意,但形式也不同,Task
因为它可以实现无分配并且通常可能更高性能。无论如何,延迟的完成也只需要等待一次。
现在一个有点幼稚的实现可能看起来像这样。这里的问题是,使用 a 根本没有任何好处ValueTask
。一个实现看起来如何能够充分利用ValueTask
承诺(便宜且无需分配)。
c# - 如果 ValueTask 依赖于返回 Task 的方法,它仍然是有益的吗?
以以下方法为例:
使用ValueTask
作为返回类型是否MyMethod
仍然具有相关的优势,ValueTask
因为我希望大部分时间我的代码将同步执行(即使我依赖于返回Task
而不是同步方法ValueTask
)?
c# - 用于 ValueTasks 的 TaskFactory 和 TaskScheduler?
我希望控制如何调用 ValueTasks;具体来说,我正在寻找
- 将它们的调用和所有潜在的延续强制到特定线程上,并且
- 为它们的每个同步块执行附加逻辑(以防它们实际上是异步的)
对于常规的 Task<T>,我可以通过 TaskFactory 和 TaskScheduler 完成所有这些工作。
ValueTasks 的那些特定类是否有任何等价物,无需将它们转换为完整的 Tasks?
或者可能有任何不同名称的类会为 ValueTasks 公开类似的、可能更小的 TaskFactory/TaskScheduler 功能子集?
我知道 ValueTask 功能是有意设计的,但感觉“应该”至少以某种基本方式控制它们的调度。不过,我还没有在框架中找到这样的东西。
c# - C# - 返回任务或价值任务是否可以事先知道结果?
看看这段代码:
鉴于这LogDatabaseCall
将返回 a Task<int>
,它可能被保存到_knownResult
中,那么应该是什么类型_knownResult
- Task<int>
或者ValueTask<int>
,性能方面的?
c# - 具有不可避免的异步等待调用的 ValueTask 方法?
我目前有以下异步方法:
如果上面的代码是热路径并且被多次调用,那么改用使用是否安全/可以ValueTask
?
我不确定的是sslim.WaitAsync
锁定调用,它总是会导致代码路径永远不会完全同步(即使_someObject
已经初始化),这与使用ValueTask
可能同步执行的路径相反?
另一个想法,也许改变SemaphoreSlim
对同步版本的调用也有意义?
我计划对上述变体进行一些基准测试,但只是想从更了解哪个选项可以考虑的人那里获得一些反馈。
c# - 如何返回取消的 ValueTask传播 OperationCanceledException,没有异步/等待?
我正在编写一个具有ValueTask<T>
返回类型并接受CancellationToken
. 如果CancellationToken
在调用该方法时已经取消了,我想返回一个取消的ValueTask<T>
( ),它在等待时IsCanceled == true
传播一个。OperationCanceledException
使用异步方法执行此操作很简单:
我决定切换到非异步实现,但现在我无法重现相同的行为。Task.FromCanceled
将结果正确包装到 cancelled ValueTask<T>
,但异常的类型是TaskCanceledException
,这是不可取的:
另一个不成功的尝试是包装一个Task.FromException
. 这个传播了正确的异常类型,但任务是错误的而不是取消的:
这个问题有什么解决方案,还是我应该接受我的 API 行为不一致,有时会传播TaskCanceledException
s(当令牌已被取消时),有时会传播OperationCanceledException
s(当令牌稍后被取消时)?
更新:作为我试图避免的不一致的一个实际示例,这是内置Channel<T>
类中的一个:
第一个ValueTask<int>
抛出 a TaskCanceledException
,因为令牌已经被取消。第二个ValueTask<int>
抛出一个OperationCanceledException
,因为令牌在 100 毫秒后被取消。
c# - 在自定义线程池上运行 ValueTasks
我希望在自定义线程池上执行一堆ValueTask
-returning 函数 - 即在我自己生成和处理的一堆线程上,而不是默认的ThreadPool
.
这意味着,这些函数的所有同步位,包括任何潜在的任务延续,都应该在我的自定义线程池上执行。
从概念上讲,类似于:
最好的方法是什么?
我目前的方法是这样的:
这似乎可行,但必须将其转换ValueTask
为 aTask
并将其提交给 aTaskFactory
感觉异常笨重。并且必须安装我的同步上下文,只是为了能够推迟一个适当的TaskScheduler
(然后立即回到旧的同步上下文)感觉也很糟糕。
我目前的方法是否存在概念上的缺陷?
更好的是,有没有更好的、不那么尴尬的方法呢?
c# - ValueTask.Preserve() 的意义何在?
ValueTask
并且ValueTask<TResult>
有一个Preserve()
方法被概括为“获取一个可以在未来任何时候使用的 ValueTask”。
这是什么意思,我们应该什么时候使用它?这是否意味着ValueTask
“在未来的任何时候”都不能使用“正常”?如果是这样,为什么?