问题标签 [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.

0 投票
1 回答
309 浏览

c# - 等待带有 ValueTask 的单个 .NET 事件

我有一个简单的ITimer界面,它只有一个经典的Elapsed.NET 事件,该事件在某个时间跨度后引发。

现在我想创建一个类似于Task.Delay(TimeSpan)但它应该使用该ITimer抽象而不是“实时”时间的功能。Task.Delay(TimeSpan)尽管返回 aValueTask而不是 a可能是一个好主意,但形式也不同,Task因为它可以实现无分配并且通常可能更高性能。无论如何,延迟的完成也只需要等待一次。

现在一个有点幼稚的实现可能看起来像这样。这里的问题是,使用 a 根本没有任何好处ValueTask。一个实现看起来如何能够充分利用ValueTask承诺(便宜且无需分配)。

0 投票
1 回答
60 浏览

c# - 如果 ValueTask 依赖于返回 Task 的方法,它仍然是有益的吗?

以以下方法为例:

使用ValueTask作为返回类型是否MyMethod仍然具有相关的优势,ValueTask因为我希望大部分时间我的代码将同步执行(即使我依赖于返回Task而不是同步方法ValueTask)?

0 投票
0 回答
70 浏览

c# - 用于 ValueTasks 的 TaskFactory 和 TaskScheduler?

我希望控制如何调用 ValueTasks;具体来说,我正在寻找

  1. 将它们的调用和所有潜在的延续强制到特定线程上,并且
  2. 为它们的每个同步块执行附加逻辑(以防它们实际上是异步的)

对于常规的 Task<T>,我可以通过 TaskFactory 和 TaskScheduler 完成所有这些工作。

ValueTasks 的那些特定类是否有任何等价物,无需将它们转换为完整的 Tasks

或者可能有任何不同名称的类会为 ValueTasks 公开类似的、可能更小的 TaskFactory/TaskScheduler 功能子集?

我知道 ValueTask 功能是有意设计的,但感觉“应该”至少以某种基本方式控制它们的调度。不过,我还没有在框架中找到这样的东西。

0 投票
3 回答
355 浏览

c# - C# - 返回任务或价值任务是否可以事先知道结果?

看看这段代码:

鉴于这LogDatabaseCall将返回 a Task<int>,它可能被保存到_knownResult中,那么应该是什么类型_knownResult- Task<int>或者ValueTask<int>性能方面的

0 投票
2 回答
190 浏览

c# - 具有不可避免的异步等待调用的 ValueTask 方法?

我目前有以下异步方法:

如果上面的代码是热路径并且被多次调用,那么改用使用是否安全/可以ValueTask

我不确定的是sslim.WaitAsync锁定调用,它总是会导致代码路径永远不会完全同步(即使_someObject已经初始化),这与使用ValueTask可能同步执行的路径相反?

另一个想法,也许改变SemaphoreSlim对同步版本的调用也有意义?

我计划对上述变体进行一些基准测试,但只是想从更了解哪个选项可以考虑的人那里获得一些反馈。

0 投票
1 回答
151 浏览

c# - 如何返回取消的 ValueTask传播 OperationCanceledException,没有异步/等待?

我正在编写一个具有ValueTask<T>返回类型并接受CancellationToken. 如果CancellationToken在调用该方法时已经取消了,我想返回一个取消的ValueTask<T>( ),它在等待时IsCanceled == true传播一个。OperationCanceledException使用异步方法执行此操作很简单:

我决定切换到非异步实现,但现在我无法重现相同的行为。Task.FromCanceled将结果正确包装到 cancelled ValueTask<T>,但异常的类型是TaskCanceledException,这是不可取的:

另一个不成功的尝试是包装一个Task.FromException. 这个传播了正确的异常类型,但任务是错误的而不是取消的:

这个问题有什么解决方案,还是我应该接受我的 API 行为不一致,有时会传播TaskCanceledExceptions(当令牌已被取消时),有时会传播OperationCanceledExceptions(当令牌稍后被取消时)?

在 Fiddle 上试试


更新:作为我试图避免的不一致的一个实际示例,这是内置Channel<T>类中的一个:

第一个ValueTask<int>抛出 a TaskCanceledException,因为令牌已经被取消。第二个ValueTask<int>抛出一个OperationCanceledException,因为令牌在 100 毫秒后被取消。

在 Fiddle 上试试

0 投票
1 回答
86 浏览

c# - 在自定义线程池上运行 ValueTasks

我希望在自定义线程池上执行一堆ValueTask-returning 函数 - 即在我自己生成和处理的一堆线程上,而不是默认的ThreadPool.

这意味着,这些函数的所有同步位,包括任何潜在的任务延续,都应该在我的自定义线程池上执行。

从概念上讲,类似于:

最好的方法是什么?

我目前的方法是这样的:

这似乎可行,但必须将其转换ValueTask为 aTask并将其提交给 aTaskFactory感觉异常笨重。并且必须安装我的同步上下文,只是为了能够推迟一个适当的TaskScheduler(然后立即回到旧的同步上下文)感觉也很糟糕。

我目前的方法是否存在概念上的缺陷?

更好的是,有没有更好的、不那么尴尬的方法呢?

0 投票
2 回答
68 浏览

c# - ValueTask.Preserve() 的意义何在?

ValueTask并且ValueTask<TResult>有一个Preserve()方法被概括为“获取一个可以在未来任何时候使用的 ValueTask”。

这是什么意思,我们应该什么时候使用它?这是否意味着ValueTask“在未来的任何时候”都不能使用“正常”?如果是这样,为什么?