Tag: 并发

在某些情况下,OptimisticConcurrencyException在entity framework中不起作用

更新(2010-12-21):根据我一直在做的测试完全重写了这个问题。 此外,这曾经是一个POCO特定的问题,但事实certificate我的问题不一定是POCO特定的。 我正在使用entity framework,我的数据库表中有一个时间戳列,应该用于跟踪乐观并发的更改。 我已将实体设计器中此属性的并发模式设置为“已修复”,并且我得到的结果不一致。 以下是一些简化的场景,它们演示了并发检查在一个场景中工作但在另一个场景中不起作用。 成功抛出OptimisticConcurrencyException: 如果我附加一个断开连接的实体,那么如果存在时间戳冲突,SaveChanges将抛出一个OptimisticConcurrencyException: [HttpPost] public ActionResult Index(Person person) { _context.People.Attach(person); var state = _context.ObjectStateManager.GetObjectStateEntry(person); state.ChangeState(System.Data.EntityState.Modified); _context.SaveChanges(); return RedirectToAction(“Index”); } 不抛出OptimisticConcurrencyException: 另一方面,如果我从数据库中检索我的实体的新副本,并对某些字段进行部分更新,然后调用SaveChanges(),那么即使存在时间戳冲突,我也不会得到OptimisticConcurrencyException : [HttpPost] public ActionResult Index(Person person) { var currentPerson = _context.People.Where(x => x.Id == person.Id).First(); currentPerson.Name = person.Name; // currentPerson.VerColm == [0,0,0,0,0,0,15,167] // person.VerColm == [0,0,0,0,0,0,15,166] currentPerson.VerColm = person.VerColm; […]

包装速率限制API调用

我有一个API调用,它接受每秒最大调用率 。 如果超过速率, 则抛出exception 。 我想把这个调用包装成一个抽象,它可以使调用率保持在极限之下。 它将像网络路由器一样:处理多个呼叫并将结果返回给正确的呼叫者,关注呼叫率。 目标是使调用代码尽可能不知道该限制。 否则,具有此调用的代码中的每个部分都必须包装到try-catch中! 例如:想象一下,您可以从可以添加2个数字的extern API调用方法。 此API可以每秒调用5次 。 高于此值的任何内容都将导致exception。 为了说明问题,限制通话费率的外部服务就像这个问题的答案中的那个 如何使用Observables构建速率限制API? 附加信息: 由于每次从代码的任何部分调用此方法时都不需要担心该限制,因此您可以考虑设计一个可以调用的包装器方法,而不必担心速率限制。 在内部你关心限制,但在外面你暴露了一个简单的异步方法。 它类似于Web服务器。 它如何将正确的结果包返回给正确的客户? 多个呼叫者将调用此方法,他们将获得结果。 这种抽象应该像代理一样。 我怎么能这样做? 我确定包装方法的公司应该是这样的 public async Task MyMethod() 在方法内部,它将执行逻辑,可能使用Reactive Extensions(Buffer)。 我不知道。 但是怎么样? 我的意思是,多次调用此方法应该将结果返回给正确的调用者。 这有可能吗? 非常感谢!

锁定aqcuired并进一步尝试锁定不阻塞:C#锁是否重入?

我已经编写了一个测试,我认为应该是一个有效的死锁案例。 看来,一旦一个类的实例获取了lock ,该实例就不再需要重新获取lock ,即使我明确地尝试调用另一个应该再次lock方法。 这是class级: internal class Tester { private readonly object _sync = new object(); public Tester() { } public void TestLock() { lock (_sync) { for (int i = 0; i < 10; i++) { Deadlock(i); } } } private void Deadlock(int i) { lock (_sync) { Trace.WriteLine(i + " no deadlock!"); } […]

Task.WhenAll结果排序

我从这里了解到Task.Whenall的任务执行顺序不是确定性的,但我找不到任何有关结果顺序的信息。 结果集合是否按照输入中排序的任务或结果的顺序包含结果? 从我做的测试来看,它似乎保留了订单,但我需要确认。

嵌套的Parallel.ForEach循环

我有一些代码,我目前正在优化多核架构中的并发性。 在我的一个课程中,我找到了一个嵌套的foreach循环。 基本上,外部循环遍历NetworkInterface对象数组。 内循环通过网络接口IP地址进行迭代。 它让我思考,是否有嵌套Parallel.ForEach循环必然是一个好主意? 阅读本文( 嵌套Parallel.ForEach循环在同一个列表上? )后,我仍然不确定在效率和并行设计方面适用的是什么。 此示例将Parallel.Foreach语句应用于两个循环都在该列表上执行操作的列表。 在我的例子中,循环正在做不同的事情,所以,我应该: 使用嵌套的Parallel.ForEach循环? 父循环上的User Parallel.ForEach并保持内部循环原样?

使用Entity Framework和MySQL实现乐观并发

我目前正在使用Entity Framework 4.1和MySQL开发应用程序。 我想使用乐观并发,因此需要创建一个表结构,允许EF检测并发问题。 我的目标与此类似: http : //blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the-entity- framework.aspx 。 我的问题是MySQL中的时间戳类型与MS SQL Server不同。 除此之外,时间戳和日期时间都不能提供MySQL的亚秒级精度(http://feedblog.org/2007/05/26/why-doesnt-mysql-support-millisecond-datetime-resolution/)。 因此,这些类型在检测并发性问题时会非常糟糕。 我可以用什么其他数据类型来解决这个问题? 我在考虑使用Guid。 但是这种方法存在两个潜在的问题:1。MySQL将Guids存储为char(36),使得效率非常低。 2.我不确定EF是否要求行版本严格增加,或者它是否足以让它独一无二。

列出并发删除和添加

我不太确定,所以我想我会问。 将项目删除并添加到System.Collections.Generic.List对象是非线程安全的吗? 我的情况: 收到连接后,它会被添加到列表中,但同时也会有一个正在删除死连接的工作人员等。 有问题吗? 会lock吗? 我也想知道我是否可以使用它的Foreach方法对列表对象使用锁。

如何让“Everyone”的IdentityReference在本地化系统上创建MutexAccessRule?

我想使用此问题或此问题中的代码来创建系统范围的互斥锁。 这在大多数系统上都可以正常工作,但在德语XP安装中,我收到“无法翻译某些或所有身份引用”的错误。 问题是“Everyone”组在这个系统上被称为“Alle”。 那么如何在所有独立于OS语言的系统上获得正确的IdentityReference来为“Everone”或“Users”创建MutexAccessRule?

使用RazorEngine同时解析Razor模板

我在MVC 3 Web应用程序中使用RazorEngine库( http://razorengine.codeplex.com/ )来使用Razor模板语言来解析字符串(不是视图)。 一般来说,这很好。 但是,当多个用户访问同时解析Razor模板的代码时,我偶尔会看到内部Razor编译器中出现的错误(请参阅下面的两个)。 我在解释这些错误时遇到了麻烦,但我的猜测是我调用Razor编译器的方式并不安全。 这是Razor编译器的已知问题吗? 正常的Razor视图( .cshtml )如何不遇到这个问题? 有没有一种解决方法比将我的所有应用程序的调用包含在互斥锁中的Razor.Parse更好? 我的调用代码如下,只是一个围绕Razor.Parse的简单包装: protected string ParseTemplate(string templateString, T model) { //This binderAssembly line is required by NUnit to prevent template compilation errors var binderAssembly = typeof(Microsoft.CSharp.RuntimeBinder.Binder).Assembly; var result = Razor.Parse(templateString, model); return result; } 错误一: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative […]

在.NET安全实践中使用Thread.Abort()并处理ThreadAbortException?

我需要在C#中开发一个multithreading的Azure辅助角色 – 创建多个线程,向它们提供请求,每个请求可能需要一些很长的时间来处理(不是我的代码 – 我将调用COM对象来进行实际工作)。 在角色关闭后,我需要优雅地停止处理。 我怎么做? 看起来如果我只调用Thread.Abort()线程中抛出ThreadAbortException ,线程甚至可以使用try-catch-finally (或using )来清理资源。 这看起来非常可靠。 困扰我的是我的经验主要是C ++,并且不可能在非托管应用程序中优雅地中止线程 – 它将在没有任何进一步处理的情况下停止,这可能会使数据处于不一致状态。 因此,如果我为一个繁忙的线程调用Thread.Abort() ,我是否会有类似的事情。 将Thread.Abort()与ThreadAbortException一起使用是否安全? 如果我这样做,我应该注意什么?