Tag: 并发

在数据库访问应用程序中管理并发的最佳方法是什么?

不久前,我编写了一个由多个用户用来处理交易创建的应用程序。 我现在还没有完成开发一段时间,我不记得我是如何管理用户之间的并发性的。 因此,我在设计方面寻求一些建议。 原始申请具有以下特征: 每个用户一个重客户端。 单个数据库。 访问数据库以便每个用户插入/更新/删除交易。 应用程序中反映交易表的网格。 每次有人更改交易时,网格都会更新。 我正在使用WPF。 这就是我想知道的: 我是否认为我不应该关心每个应用程序与数据库的连接? 考虑到每个单独存在一个单例,我希望每个客户端有一个连接没有问题。 我怎样才能防止访问的并发性? 我想我应该在修改数据时锁定,但是不记得怎么做。 如何设置网格以便在我的数据库更新时自动更新(例如,由其他用户更新)? 预先感谢您的帮助!

C#数据库应用程序并发

我使用SQL Server 2005 express作为后端在c#的某个时代编写了一个多用户应用程序。 我有一个Orders系列。 要使用此类,您需要实例化它并只需调用Load(CustomerCode)方法,以便使用指定的客户订单填充集合。 我的问题: 如何强制执行并发,以便只有1个用户可以为特定客户请求Orders集合? 当用户完成对象时(当对象设置为null时),我将需要再次使用它。

C#中的并发集合

我正在寻找一种在C#中获得并发集合的方法,或者至少是一个支持并发枚举器的集合。 现在,当我迭代的集合发生变化时,我得到一个InvalidOperationException。 我可以深度复制该集合并使用私有副本,但我想知道是否有更好的方法 代码段: foreach (String s in (List )callingForm.Invoke(callingForm.delegateGetKillStrings)) { //do some jazz } – 编辑 – 我接受了答案,但也发现我需要确保写入集合的代码也需要尝试获取锁定。 private void addKillString(String s) { lock (killStrings) { killStrings.Add(s); } }

SELECT和UPDATE表,因此Threads没有重叠

说我有下表: ID|Read ——- 1|true 2|false 3|false 4|false …我需要读取最小的ID,其中[Read] == false; 另外,更新我现在已经阅读过了。 因此,如果我执行我的存储过程dbo.getMinID,它将返回ID:2,并更新[Read] – > true。 CREATE PROCEDURE [dbo].[getMinID] ( @QueryID INT OUTPUT ) BEGIN SELECT TOP 1 @QueryID = [ID] from Table UPDATE Table SET [Read] = 1 WHERE [ID] = @QueryID END 问题是我有十(10)个异步线程同时执行dbo.getMinID,我不能让它们在任何情况下选择SAME [ID]。 我担心我的SELECT和UPDATE语句之间执行第二个线程,因此在两个场景中返回[ID]:2。 无论有多少线程对存储过程起作用,我如何确保不会选择/更新同一记录两次? 另外,请记住表CONSTANTLY添加了新行,所以我无法锁定表!

带锁或Concurency词典的字典?

这在multithreading应用程序中是首选:带锁对象的字典或并发字典 哪个有效,我为什么要使用其中一个? 编辑1:将Guid存储为键,将bool存储为值。 编辑2:超过2个工作线程和一个UI线程。

我可以在c#app中获取所有线程的堆栈跟踪吗?

我正在调试一个明显的并发问题,这个问题是我在工作中遇到的一个大问题。 有问题的错误仅在运行了许多(12+)小时后出现在某些性能较低的机器上,我从未在调试器中重现它。 因此,我的调试工具基本上只限于分析日志文件。 C#可以很容易地获得抛出exception的线程的堆栈跟踪,但是我还想在抛出exception时另外获取当前在我的AppDomain中执行的每个其他线程的堆栈跟踪。 这可能吗?

调试和诊断.NET中的锁定转发问题

我正在研究大型C#/ .NET 3.5系统的性能问题,该系统表现出性能下降,因为发出请求的用户数量每秒可扩展到40-50个不同的用户请求。 请求持续时间显着增加,而CPU和I / O负载似乎保持不变。 这让我相信,我们的系统中使用c# lock() {…}语句保护的共享对象如何影响并发访问性能可能会遇到问题。 具体来说,我怀疑在关键部分保护的常用共享数据上会发生某种程度的锁定会话(因为它是读/写)。 有没有人建议如何实际诊断锁定康复是否是问题..或者任何类型的锁争用是否导致长请求时间?

如何跨AppDomain边界传递CancellationToken?

我有一个命令对象,根据请求队列的请求进行工作。 此特定命令将在子appdomain中执行其工作。 在子appdomain中完成其工作的一部分涉及阻止ConcurrentQueue操作(例如,Add或Take)。 我需要能够通过请求队列传播中止信号,传递到子appdomain,并唤醒其中的工作线程。 因此,我认为我需要在AppDomain边界传递CancellationToken。 我尝试创建一个inheritance自MarshalByRefObject的类: protected class InterAppDomainAbort : MarshalByRefObject, IAbortControl { public InterAppDomainAbort(CancellationToken t) { Token = t; } [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)] public override object InitializeLifetimeService() { return null; } public CancellationToken Token { get; private set; } }; 并将此作为参数传递给worker函数: // cts is an instance variable which can be triggered by another […]

线程安全集合,没有订单,也没有重复

我需要一个线程安全的集合来保存没有重复的项目。 ConcurrentBag允许HashSet , HashSet不是线程安全的。 在.NET Framework 4.5中是否有这样的集合?

如何获得两个地方的锁定,但在一个地方释放?

我是c#的新手。 我需要在两种方法中获得锁定,但是在一种方法中释放。 那会有用吗? public void obtainLock() { Monitor.Enter(lockObj); } public void obtainReleaseLock() { lock (lockObj) { doStuff } } 特别是我可以调用obtainLock然后obtainReleaseLock吗? C#中是否允许“doubleLock”? 始终从同一个线程调用这两个方法,但是在另一个线程中使用lockObj进行同步。 upd:在所有评论之后你对这样的代码有什么看法? 这是理想的吗? public void obtainLock() { if (needCallMonitorExit == false) { Monitor.Enter(lockObj); needCallMonitorExit = true; } // doStuff } public void obtainReleaseLock() { try { lock (lockObj) { // doAnotherStuff } } finally […]