假设我有两个序列返回整数1到5.
第一个返回1,2和3非常快,但4和5每个需要200ms.
public static IEnumerable<int> FastFirst()
{
for (int i = 1; i < 6; i++)
{
if (i > 3) Thread.Sleep(200);
yield return i;
}
}
Run Code Online (Sandbox Code Playgroud)
第二个返回1,2和3,延迟时间为200ms,但快速返回4和5.
public static IEnumerable<int> SlowFirst()
{
for (int i = 1; i < 6; i++)
{
if (i < 4) Thread.Sleep(200);
yield return i;
}
}
Run Code Online (Sandbox Code Playgroud)
联合这两个序列只给出数字1到5.
FastFirst().Union(SlowFirst());
Run Code Online (Sandbox Code Playgroud)
我不能保证两种方法中的哪一种在什么时候有延迟,所以执行的顺序不能保证为我提供解决方案.因此,我想将联盟并行化,以便最小化我的例子中的(人为的)延迟.
一个真实场景:我有一个返回一些实体的缓存,以及一个返回所有实体的数据源.我希望能够从一个方法返回一个迭代器,该方法将请求内部并行化到缓存和数据源,以便缓存的结果尽可能快地生成.
注1:我意识到这仍然在浪费CPU周期; 我不是问我怎么能阻止序列迭代它们的慢元素,我怎么能尽可能快地结合它们.
更新1:我已经定制了achitaka-san对接受多个生成器的响应,并使用ContinueWhenAll将BlockingCollection的CompleteAdding设置为一次.我只是把它放在这里,因为它会因缺少注释格式而丢失.任何进一步的反馈都会很棒!
public static IEnumerable<TResult> SelectAsync<TResult>(
params IEnumerable<TResult>[] producer)
{
var resultsQueue = new BlockingCollection<TResult>();
var taskList …Run Code Online (Sandbox Code Playgroud) 我认为这是一个非常普通的问题,但我在谷歌上找不到任何东西。
我正在学习 NextJs(使用 TypeScript)并且我有一个站点成功地使用动态路由、SSR 和增量再生,所有设置和部署到 Vercel。这是我的动态路由处理程序中的GetStaticProps和GetStaticPaths代码示例:
export const getStaticPaths: GetStaticPaths = async () => {
const routes = new CmsHelper().GetRoutes();
const paths = (await routes).items.map((item, index, items) => {
return item.fields.urlPath;
})
return {
paths: paths,
fallback: 'blocking',
};
}
export const getStaticProps: GetStaticProps = async (context) => {
const urlParts = context.params?.url as string[] || [];
const urlPath = `/${urlParts.join('/')}`;
const article = await new CmsHelper().GetArticle(urlPath);
return {
props: {
article
},
revalidate: 10,
} …Run Code Online (Sandbox Code Playgroud) 在Autofac中,可以执行以下操作来获取所有已注册的服务:
IEnumerable<MyClass> all = Context.Resolve<IEnumerable<MyClass>>()
Run Code Online (Sandbox Code Playgroud)
但是,这不包括那些注册为命名服务的内容.
查看Autofac源代码似乎是因为基于TypedService或KeyedService查询服务的解析.
有没有办法解决IEnumerable的所有服务,无论他们是否注册了名称?
我让 TeamCity (7.0.2) 从自定义 AMI 成功启动了一个 EC2 VM,运行我们的构建,并发送回构建工件。
但是,即使我曾经使用较旧的 TeamCity 版本执行此操作,我也总是不满意这种想法,即它只是在完成后终止实例,然后在下次需要构建代理时使用配置的 AMI 创建新实例。
我可以让 TeamCity 发出“停止”命令,然后发出“开始”命令吗?这有很多优点——更快的启动时间、允许代理统计中的命名实例以及将 Mercurial 克隆保存到 EBS 以备下一次构建只有三个。
ps 我想我可以使用链式构建直接调用 EC2 API,而不是使用内置的云支持,但这听起来工作量很大,而且感觉很不稳定
teamcity amazon-ec2 amazon-web-services ec2-api-tools teamcity-7.0
RavenDb 5+ 添加了对文档时间序列存储的支持。此支持中包括索引,尽管为了创建存储和索引性能优势,索引是按批次 TimeSeriesSegments 完成的。
RavenDb 支持计算这些 TimeSeries 上的基本 Count/Avg/Sum 总计。但是,我找不到计算移动的方法窗口内
例如,我可能有 50 天的值,每天一个值。使用内置的 Avg,我可以轻松地对所有 50 天的平均值进行索引。但是,我想创建一个索引字段,其中包含 5 天窗口内的移动平均值。因此,前 X-1 天的值将为空/空白,从该点开始将计算之前 X 天的平均值。
我无法在 RavenDb 的 map/reduce 索引策略中找到一种简单的方法来完成此任务,但我希望我错过了一些巧妙的方法(例如)从 Map 操作中运行查询以查询以前的值,即使它们可能不属于当前的 TimeSeriesSegment。
如果可能的话,我还希望能够更进一步并计算其中几个移动平均线的复合 - 例如,随时间变化的值的指数移动平均线。
这是索引的理想操作,因为数据写入后不会改变,但我不知道定义 RavenDb 索引时是否有窗口/游标样式支持。
我可以在类似 SQL 的存储中使用触发器等而不是 RavenDb 来实现此目的,但如果可能的话,我不希望将一些代码存储在存储过程中,而将一些代码存储在我的 C# 代码库中。
蒂亚!
在Autofac中,可以在注册服务时指定TypedParameter,该服务给出将传递给服务构造函数的特定值或委托.在解析/实例化期间,将通过类型发现构造函数上的实际参数.
在Ninject中,我只能找到对命名参数的支持(即,提前知道.ctor参数的实际名称).否则,Ninject将发现未指定的构造函数参数,并尝试通过检查容器来解析所需的任何类型.
但是,这对我的需求来说还不够具体,因为我需要传递给不同服务实例的构造函数的多个相同类型的实例.
我想给Ninject一个特定的工厂委托或值作为构造函数参数,只给出一个类型作为限定符,而不是参数名称.我也不希望通过使用任何属性修饰构造函数参数来依赖Ninject.
这可能吗?提前谢谢了!
autofac ×2
.net ×1
amazon-ec2 ×1
c# ×1
contentful ×1
indexing ×1
mapreduce ×1
next.js ×1
ninject ×1
plinq ×1
ravendb ×1
teamcity ×1
teamcity-7.0 ×1
time-series ×1
typescript ×1