Tag: 并发

如何尽快有效地制作1000个Web请求

我需要从C#控制台应用程序中制作100,000个轻量级(即小内容长度)Web请求。 我能做到这一点的最快方法是什么(即在最短的时间内完成了所有请求)以及我应该遵循哪些最佳实践? 我无法解雇,因为我需要捕捉回应。 据推测,我想要使用async Web请求方法,但是我想知道存储所有Task延续和编组的开销会产生什么影响。 内存消耗不是一个整体关注,目标是速度。 据推测,我也想利用所有可用的核心。 所以我可以这样做: Parallel.ForEach(iterations, i => { var response = await MakeRequest(i); // do thing with response }); 但这不会让我比我的核心数更快…… 我可以: Parallel.ForEach(iterations, i => { var response = MakeRequest(i); response.GetAwaiter().OnCompleted(() => { // do thing with response }); }); 但是如何让我的程序在ForEach之后运行。 坚持所有的Tasks和WhenAll他们感到臃肿时,是否有任何现有的模式或帮助者拥有某种任务队列? 有没有办法让它变得更好,我该如何处理限制/错误检测? 例如,如果远程端点响应缓慢,我不想继续发送垃圾邮件 我明白我还需要这样做: ServicePointManager.DefaultConnectionLimit = int.MaxValue 有什么必要吗?

什么时候BlockingCollection TryTake()可以返回false?

假设BlockingCollection正在使用下面的ConcurrentQueue,如果你使用Timeout.Infinite ,TryTake(T,Int32)方法什么时候会返回false?

具有动态maxCount的SemaphoreSlim

我遇到了一个问题,我需要限制对另一个Web服务器的调用次数。 它会有所不同,因为服务器是共享的,也许它可能有更多或更少的容量。 我在考虑使用SemaphoreSlim类,但没有公共属性来更改最大计数。 我应该将我的SemaphoreSlim类包装在另一个将处理最大计数的类中吗? 有没有更好的方法? 编辑: 这是我正在尝试的: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Semaphore { class Program { static SemaphoreSlim _sem = new SemaphoreSlim(10,10000); static void Main(string[] args) { int max = 15; for (int i = 1; i <= 50; i++) { new Thread(Enter).Start(new int[] { i, […]

Windows服务+ Windows窗体应用程序。 一个数据库。 关于并发的建议

我有SQL Server数据库与文件的信息 – 我在谈论自定义属性。 这些是每个文件的类别和描述。 Windows窗体应用程序适用于用户。 但我还将创建一个Windows服务来跟踪文件的任何变化。 如果发生更改(重命名,移动,删除),则服务必须相应地更新同一数据库。 而且我认为它应该马上做,不要拖延。 现在这将是我第一次制作WS plus,这是我第一次处理并发(理论上我知道线程等等)。 所以: 首先,如果一个进程正在更新另一个进程可能同时使用的数据库,那么可以吗? 你需要首先处理这种情况吗? (可能是我们日常“用户生活”中的fx,我们无法在另一个进程使用时修改文件) 这两个想法共享一个数据源好吗? 如果是,那么如何处理并发? 我可以使用WCF来处理两者之间的消息,但是解决方案是否与WCF有关? 因为我也是第一次使用它:D。 任何帮助表示赞赏。 提前谢谢!

NET 4.0 SpinWait方法与4.0之前的SpinWait()有何不同?

MSDN “线程安全集合.NET Framework 4”声明: “一些并发集合类型使用轻量级同步机制,如SpinLock , SpinWait , SemaphoreSlim和CountdownEvent ,它们是.NET Framework 4中的新增function” 虽然MSDN网站告诉SpinWaitwas可用于.NET 1.1,而另一篇MSDN文章从.NET 4.0启动SpinWaitwas 好吧,好奇心来自Lee Grissom的评论,以回答SynchronizedCollection和其他并发集合之间的区别是什么? : “@Matt,.NET4并发类使用SpinWait对象来解决线程安全而不是Monitor.Enter / Exit(又称Critical部分)?” 以及第一个NSDN引用声明SpinWait是.NET 4.0的新手 那么,它是新的还是不是? 如果新的那么如何?

如果2个或更多人在同一时间更新记录会发生什么?

我正在使用NHibernate和version属性,每次更新聚合根时都会自动递增。 如果2个或更多人在同一时间更新同一记录会怎样? 另外,我该怎么测试呢? 请注意,这不是我一直在进行的情况,只是想知道。

使“修改时枚举”集合成为线程安全的

我想创建一个可以在枚举时修改的线程安全集合。 示例ActionSet类存储Action处理程序。 它有Add方法,它为列表添加一个新的处理程序,以及枚举和调用所有收集的操作处理程序的Invoke方法。 预期的工作方案包括非常频繁的枚举,在枚举时偶尔进行修改。 如果在枚举未结束时使用Add方法修改它们,则正常集合会抛出exception。 这个问题有一个简单但缓慢的解决方案:在枚举之前克隆集合: class ThreadSafeSlowActionSet { List _actions = new List(); public void Add(Action action) { lock(_actions) { _actions.Add(action); } } public void Invoke() { lock(_actions) { List actionsClone = _actions.ToList(); } foreach (var action in actionsClone ) { action(); } } } 这个解决方案的问题是枚举开销,我希望枚举非常快。 我创建了一个相当快速的“递归安全”集合,允许在枚举时添加新值。 如果在枚举main _actions集合时添加新值, _actions将值添加到临时_delta集合而不是主集合。 完成所有枚举后, _delta值将添加到_actions集合中。 如果在枚举main _actions集合时添加一些新值(创建_delta集合),然后再次重新输入Invoke方法,我们必须创建一个新的合并集合( […]

易变性和只读是否相互排斥?

假设我正在设计一个包装内部集合的线程安全类: public class ThreadSafeQueue { private readonly Queue _queue = new Queue(); public void Enqueue(T item) { lock (_queue) { _queue.Enqueue(item); } } // … } 基于我的另一个问题 ,上面的实现是错误的,因为当它的初始化与其使用同时执行时可能会出现种族危险: ThreadSafeQueue tsqueue = null; Parallel.Invoke( () => tsqueue = new ThreadSafeQueue(), () => tsqueue?.Enqueue(5)); 上面的代码是可接受的非确定性的:该项目可能会或可能不会入队。 但是,在当前的实现中,它也被破坏了,并且可能引起不可预测的行为,例如抛出IndexOutOfRangeException , NullReferenceException ,多次排队同一项,或者陷入无限循环。 这是因为Enqueue调用可能在将新实例分配给局部变量tsqueue之后但在内部_queue字段的初始化完成(或似乎完成)之前运行。 Per Jon Skeet : Java内存模型不能确保构造函数在将新对象的引用分配给实例之前完成 。 Java内存模型经历了1.5版的重新加工,但是在没有volatile变量的情况下,双重检查锁定仍然被破坏( […]

ConcurrentBag – 添加多个项目?

有没有办法一次向ConcurrentBag添加多个项目,而不是一次添加一个? 我没有在ConcurrentBag上看到AddRange()方法,但是有一个Concat()。 但是,这对我不起作用: ConcurrentBag objectList = new ConcurrentBag(); timeChunks.ForEach(timeChunk => { List newList = Foo.SomeMethod(x => x.SomeReadTime > timeChunk.StartTime); objectList.Concat(newList); }); 这段代码曾经在Parallel.ForEach()中,但我将其更改为上面所以我可以对其进行故障排除。 变量newList确实有对象,但是在objectList.Concat 行之后,objectList总是有0个对象。 Concat 不能那样工作吗? 我是否需要使用Add()方法一次一个地向ConcurrentBag添加项目?

处理并发文件写入

我正在开发一个ASP.NET应用程序,它接受用户输入并将它们序列化为文本文件。 现在,当仍在写入文件时发出第二个更新请求时,将生成IOException。 如何处理此文件的并发更新请求?