假设我有这个功能(假设我以线程安全的方式访问Cache):
object GetCachedValue(string id)
{
if (!Cache.ContainsKey(id))
{
//long running operation to fetch the value for id
object value = GetTheValueForId(id);
Cache.Add(id, value);
}
return Cache[id];
}
Run Code Online (Sandbox Code Playgroud)
我想阻止两个线程同时运行" 长时间运行"操作同一个值.显然我可以将整个东西包装在一个lock()中,但是整个函数会阻塞而不管值是什么,我希望两个线程能够执行长时间运行操作,只要它们正在寻找不同的id.
是否存在基于值锁定的内置锁定机制,因此一个线程可以在另一个线程完成长时间运行操作时阻塞,因此我不需要执行两次(或N次)?理想情况下,只要在一个线程中执行长时间运行操作,其他线程就不应该为相同的id值执行此操作.
我可以通过将id放在HashSet中然后在操作完成后删除它们来自己滚动,但这看起来像是一个黑客.
我有一个长时间运行的进程,它读取大文件并写入摘要文件.为了加快速度,我使用常规旧线程同时处理多个文件:
ThreadStart ts = new ThreadStart(Work);
Thread t = new Thread(ts);
t.Start();
Run Code Online (Sandbox Code Playgroud)
我发现即使单独的线程读取单独的文件并且它们之间没有锁定并且在24核盒子上使用4个线程,我甚至无法在CPU上获得10%或在磁盘上获得10%I/O. 如果我在我的应用程序中使用更多线程,它似乎运行得更慢.
我猜我做错了什么,但是好奇的是,如果我第二次和第三次启动整个exe,那么它实际上处理文件的速度提高了两到三倍.我的问题是,为什么我不能在我的一个应用程序中获得12个线程来处理数据并对机器征税以及3个我的应用实例中的4个线程?
我已经分析了应用程序,最耗时和频繁调用的函数都是字符串处理调用.
在我将一个字符串传递给Graphics.DrawString()之前,我想知道每个字符的确切位置 - 不仅仅是它的偏移和宽度,而是它的上升/下降的精确边界框,以便我可以进行碰撞检测在角色级别而不是使用Graphics.MeasureString()给我的整个行高.
我似乎无法找到任何准确返回每个角色的边界框的示例.如何在c#/ GDI +中完成?
理想情况下,我想获得此图像中的每个灰色矩形:

我有这样一张桌子:
Products
(
ID int not null primary key,
Type int not null,
Route varchar(20) null
)
Run Code Online (Sandbox Code Playgroud)
我在这个格式的客户端上有一个列表:
Type=1, Percent=0.4, Route=A
Type=1, Percent=0.4, Route=B
Type=1, Percent=0.2, Route=C
Type=2, Percent=0.5, Route=A
Type=2, Percent=0.5, Route=B
Type=3, Percent=1.0, Route=C
...etc
Run Code Online (Sandbox Code Playgroud)
完成后,我想将40%的1型产品分配给A路线,40%分配给路线B,20%分配给路线C.然后50%的2型产品分配到路线A,50%的2型产品分配到路线B等
有没有办法在单个更新语句中执行此操作?
如果不是在一个巨大的声明中,是否可以在每种类型的一个语句中或每个路由一个语句中完成?目前我们正在为每种类型+路线做一个上述任何一项改进.
即使用户向下滚动,也很容易保持我的布局中的列固定,因此它始终可见.
当页面向下滚动足够远以使其离开视口时,也很容易将列向下移动到页面,因此它在滚动开始之前就已锚定.
我的问题是,我的左手列,它是更高,所以你需要能够向下滚动才能看到的所有内容(控制)在左边的列,但在当你向上滚动你想看到的同时比普通窗口再次控制的顶部.
这是我想要实现的目标:

所以左列总是占据窗口高度的100%,但是当用户向下滚动时,他们可以看到div的底部,当他们开始向上滚动卷轴时,直到它再次到达窗口的顶部.所以无论他们滚动页面多远,div的顶部总是在附近.
是否有一些jQuery魔法可以实现这一目标?
正如它在问题中所说,给定一个大文本文件,如何将其内容放入sql server中的nvarchar(max)列而不将整个文件内容加载到内存中(用于构建动态sql语句或作为SP参数) )?
到目前为止,我最好的解决方案是插入一个空值的行,然后在循环运行中每次在事务中更新附加数据块.除了将文件复制到数据库服务器并使用BCP之外,还有更好的方法吗?流式传输数据的一些方法?
我不想对某些表进行轮询,而是想发出一个等待的c#应用程序,表示要在表中处理新行,可能是通过触发器.有没有办法让数据库向控制台应用程序发出信号,或者我是否卡在表中查找新行?
我有一个应用程序,非常适合处理位于我的服务器上的目录中的文件.过程是:
1) check for files in a directory
2) queue a user work item to handle each file in the background
3) wait until all workers have completed
4) goto 1
Run Code Online (Sandbox Code Playgroud)
这很好用,我从不担心同一个文件被处理两次或多个线程为同一个文件生成.但是,如果有一个文件需要很长时间才能处理,那么步骤#3会挂起该文件并保留所有其他处理.
所以我的问题是,为我需要处理的每个文件生成一个线程的正确范例是什么,而如果一个文件需要太长时间则不阻塞?我考虑过FileSystemWatcher,但文件可能无法立即读取,这就是为什么我不断查看所有文件并为每个文件生成一个进程(如果文件被锁定将立即退出).
我应该删除步骤#3并维护我已经处理过的文件列表吗?这似乎很混乱,随着时间的推移,列表会变得非常大,所以我怀疑这是一个更优雅的解决方案.
我需要根据历史数据随时间均匀分布一组数据,以使每个数字在每个位置随时间呈现相等(或接近相等)的次数.问题是,给定过去使用的排序列表,看起来像这样(但可以有任意数量的元素):
1,2,5,3,4
4,1,5,2,3
1,3,5,2,4
4,1,2,3,5
2,4,1,3,5
5,1,4,3,2
1,5,3,2,4
5,1,3,2,4
3,2,5,4,1
4,3,1,5,2
Run Code Online (Sandbox Code Playgroud)
如何找到最少使用的值的排序,并将导致"更平衡"的排序组.显而易见的答案是我可以分组并计算它们并选择最少使用的一个,但问题是可能从未使用过的最少使用的排列,例如这里,排序"1,2,3,4,5"是最少使用的候选人,因为它根本没有出现.
简单的答案似乎是确定哪个位置"1"出现在最不频繁的位置,并将该位置设置为"1",依此类推每个数字.我怀疑这是有效的,但我觉得有一个更优雅的解决方案,我没有考虑过可能有交叉连接,所以包括所有可能的组合.
有任何想法吗?
我有一个工作得很好的iPhone应用程序 - 它基本上只显示来自Feed的新闻,但现在我们想要第二个应用程序,它是第一个的克隆,但以不同的方式标记并显示来自不同Feed的新闻 - xml提要而图形/颜色将是唯一的区别.
我试图不重复任何努力.我可以使用不同的颜色和图像以及带有一个代码库的xml feed url轻松设置定义和构建应用程序.但是这样做的首选方法是什么,以便我可以对一些常见代码进行更改并轻松地重建这两个应用程序并在应用程序商店中更新它们,而无需维护单独的xcode项目,单独的文件等?
c# ×7
sql-server ×3
algorithm ×1
app-store ×1
css ×1
gdi+ ×1
ios ×1
javascript ×1
jquery ×1
locking ×1
permutation ×1
sql ×1