我想知道使用链接到一个或多个ActionBlocks的BufferBlock是否有好处,除了限制(使用BoundedCapacity),而不是直接发布到ActionBlock(只要不需要限制).
我面临两难困境:我在C#中拥有扎实的ASP.NET开发经验,并希望开始移动开发.我已经做过研究,并且知道在Windows上获得iOS开发环境有一些黑客攻击,最近Apple取消了对第三方开发应用程序的禁令后,Adobe Flash CS5可用于打包iOS应用程序.我确实有一些Flash和AS2的经验.所以我的问题是:我应该使用适用于iOS的Flash CS5和适用于Android的MonoDroid,还是应该使用Mac并学习iOS的Objective C并学习Android的Java?什么是最实用的解决方案?
先感谢您
编辑:最后,在针对Android SDK和Android的Mono中尝试了Eclipse中的Java开发之后,我认为最好在本机环境中编写Android应用程序.Eclipse FTW!至于iOS,我认为最好使用原生Mac工具和Objective C.
场景:接收数据并将其写入带有时间戳的数据库.我需要按照基于时间戳接收的顺序处理原始数据,并将其写回数据库,不同的表,再次根据时间戳维护订单.
我提出了以下设计:创建了两个队列,一个用于存储来自数据库的原始数据,另一个用于存储已处理的数据,然后再写回数据库.我有两个线程,一个读取初始队列,另一个读取Result队列.在我之间生成多个线程来处理来自Initial队列的数据并将其写入Result队列.
我已经尝试过SortedList(手动锁定)和BlockingCollection.我使用了两种并行处理方法:Parallel.For(ForEach)和TaskFactory.Task.StartNew.
基于若干因素,每个数据单元可能花费可变的时间来处理.一个线程仍然可以处理第一个数据点,而其他线程每个处理三个或四个数据点,搞乱了时间戳顺序.
我最近发现了OrderingPartitioner,我认为它可以解决问题,但是按照MSDN的例子我可以看到,它也没有对基础集合进行排序.可能是我需要实现自定义分区器来订购我的复杂数据类型集合?或者可能有更好的方法来解决问题?
任何有关讨论类似问题的文章的建议和/或链接都受到高度赞赏.
我最近一直在试验地理数据类型并且喜欢它.但是我无法决定是否应该从我当前的模式转换,将两个单独的数字(9,5)字段中的纬度和经度存储到地理类型.我已经计算了两种类型的大小,Lat/Long表示一个点的方式是单个点28个字节,而地理类型是26个.空间不是很大的增益,但是在执行地理空间操作(交叉,距离测量等)方面有很大改进.当前使用笨拙的存储过程和标量函数处理的.我想知道的是指数.地理数据类型是否需要更多空间来索引数据?我有一种感觉,即使存储在列中的实际数据较少,我认为地理空间索引的工作方式最终会为它们带来更大的空间分配.
PS作为旁注,似乎SQL Server 2008(不是R2)不会自动搜索地理空间索引,除非明确告知使用WITH(INDEX())子句
我不确定这是否可能,但如果是的话,我可能做得不对.假设我有一个链接到许多消费者的共享缓冲区(ActionBlocks).每个使用者应该使用满足用于将其链接到缓冲区的谓词的数据.例如,ActionBlock1应该使用满足的数字x => x % 5 == 0
,ActionBlock2应该只消耗x => x % 5 == 1
等.
这是我得到的:
private static ITargetBlock<int> BuildPipeline(int NumProductionLines)
{
var productionQueue = new BufferBlock<int>();
for (int i = 0; i < NumProductionLines; i++)
{
ActionBlock<int> productionLine = new ActionBlock<int>(num => Console.WriteLine("Processed by line {0}: {1}", i + 1, num));
productionQueue.LinkTo(productionLine, x => x % NumProductionLines == i);
}
return productionQueue;
}
Run Code Online (Sandbox Code Playgroud)
然后我打电话给:
Random rnd = new Random();
ITargetBlock<int> temp = BuildPipeline(5);
while (true)
{
temp.Post(rnd.Next(255)); …
Run Code Online (Sandbox Code Playgroud) 通过字典中的两个键索引值的最佳方法是什么.例如:让学生使用唯一的Id(整数)和用户名(字符串)创建一个字典,其中包含由Id和username索引的学生类型的对象.然后在检索上使用Id或用户名.或者可能是词典不是很好的匹配?PS我知道元组,但没有看到如何在这种情况下使用它们.
编辑:作为使用两个键的替代方法,我可以创建一个由唯一分隔符分隔的id和username的字符串表示,然后使用正则表达式匹配键?!例:"1625 | user1"
我已经尝试了这两个循环,并注意到即使Task的Action委托中的常规foreach循环应该并行执行,它也不会并行处理元素.但是,如果我用Parallel.ForEach替换它,我看到数据正在跨多个线程并行处理.
代码1:
Task loadingTask1 = Factory.StartNew(() =>
{
foreach (MyOneClass dg in Queue.GetConsumingEnumerable())
{
MyOtherClass vl = new MyOtherClass();
vl.Id = dg.Id;
vl.PerformTimeConsumingAction();
OutputQueue.Add(vl);
}
});
Run Code Online (Sandbox Code Playgroud)
代码2:
Task loadingTask2 = Factory.StartNew(() =>
{
Parallel.ForEach(Queue.GetConsumingEnumerable(), (dg) =>
{
MyOtherClass vl = new MyOtherClass();
vl.Id = dg.Id;
vl.PerformTimeConsumingAction();
OutputQueue.Add(vl);
});
});
Run Code Online (Sandbox Code Playgroud)
在每次迭代时使用Console.Write语句运行的代码1似乎等待上一个循环完成,直到它抓住下一个循环,但代码2确实并行处理多个元素.
我是否正确理解Task.Action中的常规foreach?我认为.NET将启动尽可能多的任务线程作为加载保证,并且每个迭代的foreach将被并行处理.
我也尝试将PLINQ结果传递给上述代码和观察者相同的行为:常规foreach似乎等待上一次迭代完成以启动下一个代码,即使我已经使用了.AsParallel()
和.WithExecutionMode(ParallelExecutionMode.ForceParallelism)
指令.
任何见解都将受到高度赞赏.我知道OrderingPartitioner类,可能会尝试使用它
我试图更好地理解并行处理的整个概念并设置测试用例.在使用测试之后,我发现使用Dataflow ActionBlock
(或TransformBlock
)中的异步方法调用不会对性能产生积极影响,它只会使代码复杂化.我是否正确地假设如果我使用Dataflow Blocks,其中的代码不必是异步的,Dataflow将使其本身异步.或者我错过了这一点?
c# ×6
tpl-dataflow ×3
.net ×2
android ×1
async-await ×1
c#-4.0 ×1
dictionary ×1
flash-cs5 ×1
geospatial ×1
ios ×1
sql-server ×1
sqlgeography ×1
xamarin.ios ×1