Tag: 并发

.NET 4.0中的并发优先级队列

似乎.NET 4.0中有很多与并发相关的改进可能依赖于并发优先级队列。 框架内是否有可靠的优先级队列实现可供重用?

异步WPF命令

注意 :如果您需要完整的源代码,则此问题中的代码是deSleeper的一部分。 我想要的命令之一是异步操作的烘焙设计。 我希望在执行命令时按下按钮以禁用,并在完成时返回。 我希望在ThreadPool工作项中执行实际工作。 最后,我想要一种方法来处理异步处理过程中发生的任何错误。 我的解决方案是AsyncCommand: public abstract class AsyncCommand : ICommand { public event EventHandler CanExecuteChanged; public event EventHandler ExecutionStarting; public event EventHandler ExecutionComplete; public abstract string Text { get; } private bool _isExecuting; public bool IsExecuting { get { return _isExecuting; } private set { _isExecuting = value; if (CanExecuteChanged != null) […]

并发冲突:UpdateCommand影响了预期的1条记录中的0条

这是代码,为什么我得到这个错误的任何想法? private SQLiteDataAdapter DA_Webfiles; // Setup connection, fill dataset etc DataTable dt = this.dataSet.Tables[“WEBFILES”]; DataRow newRow = dt.NewRow(); newRow[“PATH”] = _url; dt.Rows.Add(newRow); this.DA_Webfiles.Update(this.dataSet, “WEBFILES”); // Works to Here newRow[“CONTENT_TYPE”] = “Test Content Type”; this.DA_Webfiles.Update(this.dataSet, “WEBFILES”); // Get ERROR here – Concurrency violation: the UpdateCommand affected 0 of the expected 1 records

Parallel.ForEach不断产生新线程

当我在我的程序中使用Parallel.ForEach时,我发现有些线程似乎永远不会完成。 实际上,它一直在反复产生新的线程,这种行为是我没想到的,绝对不想要的。 我能够使用以下代码重现此行为,就像我的“真实”程序一样,它们都使用处理器和内存(.NET 4.0代码): public class Node { public Node Previous { get; private set; } public Node(Node previous) { Previous = previous; } } public class Program { public static void Main(string[] args) { DateTime startMoment = DateTime.Now; int concurrentThreads = 0; var jobs = Enumerable.Range(0, 2000); Parallel.ForEach(jobs, delegate(int jobNr) { Interlocked.Increment(ref concurrentThreads); int […]

C#结构是否安全?

C#struct是否是线程安全的? 例如,如果有: struct Data { int _number; public int Number { get { return _number; } set { _number = value; } } public Data(int number) { _number = number; } } 在另一种类型: class DadData { public Data TheData { get; set; } } 是名为TheData的属性,线程安全吗?

如何在.Net中实现ConcurrentHashSet

我试图在ConcurrentDictionary的精神中实现一个ConcurrentHashSet,采取的方法是使用内部支持ConcurrentDictionary并编写小的委托方法,这是我得到了多远,但是设置理论方法是我坚持,尤其是。 我不确定我是否可以使用foreach并且仍然不违反并发性 public class ConcurrentHashSet : ISet { private readonly ConcurrentDictionary _internal; public ConcurrentHashSet(IEnumerable elements = null) { _internal = new ConcurrentDictionary(); if (elements != null) UnionWith(elements); } public void UnionWith(IEnumerable other) { if (other == null) throw new ArgumentNullException(“other”); foreach (var otherElement in other) Add(otherElement); } public void IntersectWith(IEnumerable other) { throw new NotImplementedException(); […]

如何确保时间戳始终是唯一的?

我正在使用时间戳来临时命令我的程序中的并发更改,并要求更改的每个时间戳都是唯一的。 但是,我发现简单地调用DateTime.Now是不够的,因为如果快速连续调用它通常会返回相同的值。 我有一些想法,但没有什么比这更好的解决方案了。 有没有我可以编写的方法可以保证每个连续的调用产生一个唯一的DateTime ? 我应该为此使用不同的类型,也许是长整数? DateTime具有明显的优势,可以像实时一样轻松解释,不像增量计数器。 更新:这是我最终编写的一个简单的折衷解决方案仍然允许我使用DateTime作为我的临时密钥,同时在每次调用方法时确保唯一性: private static long _lastTime; // records the 64-bit tick value of the last time private static object _timeLock = new object(); internal static DateTime GetCurrentTime() { lock ( _timeLock ) { // prevent concurrent access to ensure uniqueness DateTime result = DateTime.UtcNow; if ( result.Ticks <= _lastTime […]

.NET中管理单独(单个)线程上任务队列的最佳方式

我知道异步编程多年来已经发生了很多变化。 我有点尴尬,我让自己在34岁时就生锈了,但我依靠StackOverflow让我加快速度。 我想要做的是在一个单独的线程上管理“工作”队列,但是这样一次只能处理一个项目。 我想在这个线程上发布工作,它不需要将任何东西传递给调用者。 当然,我可以简单地启动一个新的Thread对象并让它在一个共享的Queue对象上循环,使用sleeps,interrupt,wait handle等等。但是我知道事情从那以后变得更好了。 我们有BlockingCollection , Task , async / await ,更不用说可能抽象了很多的NuGet包。 我知道“什么是最好的……”这些问题通常是不受欢迎的,所以我会通过说“目前推荐的是什么……”的方式来改写,最好使用内置的.NET机制。 但是如果第三方NuGet包简化了一堆东西,它也是如此。 我认为一个TaskScheduler实例的固定最大并发性为1,但似乎现在可能没有那么笨重的方法了。 背景 具体来说,我在这种情况下尝试做的是在Web请求期间排队IP地理定位任务。 相同的IP可能会多次排队等待地理定位,但是任务将知道如何检测并尽快跳过,如果它已经解决了。 但请求处理程序只是将这些() => LocateAddress(context.Request.UserHostAddress)调用抛出到队列中,让LocateAddress方法处理重复的工作检测。 我正在使用的地理位置API不喜欢被请求轰炸,这就是为什么我想一次将它限制为单个并发任务。 但是,如果允许通过简单的参数更改轻松扩展到更多并发任务,那将会很好。