Tag: concurrency

有什么能比Concurrent集合更好地解决这个multithreading场景

我有一个持久的B +树,多个线程正在读取树的不同块并对读取数据执行一些操作。 有趣的部分:每个线程产生一组结果,作为最终用户,我想在一个地方看到所有结果。 我做了什么:一个ConcurentDictionary和所有线程正在写它。 这一切都很顺利。 但是应用程序是时间关键的,一秒钟意味着完全不满意。 与Dictionary相比,ConcurentDictionary因为线程安全开销本质上很慢。 我可以使用Dictionary,然后每个线程都会将结果写入不同的词典。 但是我会遇到合并不同词典的问题。 。 我的问题: 并发集合是否适合我的场景? 如果不是(1),那么我将如何合并最佳不同的词典。 鉴于此, (a)逐个复制项目和(b) LINQ是已知的解决方案,并不像预期的那样最佳:) 如果不是(2);-)你会建议什么? 。 快速信息: #Thread = processorCount。 应用程序可以在标准笔记本电脑(即4个线程)或高端服务器(即<32个线程)上运行 物品数量。 该树通常拥有超过1.0E + 12项。

自定义TaskScheduler,SynchronizationContext?

async等待演员内部的支持 我将演员lib Akka移植到.NET( https://github.com/rogeralsing/Pigeon )我想在我的演员中添加async / await支持。 这给了我一些问题,因为如果我使用默认调度程序,await continuation将运行与actor并发boundarys相关。 这意味着,当actor处理消息时,可以继续运行,因为这将导致两个线程同时访问actor内部状态。 如果我能以某种方式将任务安排到演员自己的邮箱,并在邮箱运行中完成任务,这将解决问题。 public class SomeActor : UntypedActor { protected override OnReceive(object message) { if (message is SomeMessage) { DoAsyncStuff(); } } private async void DoAsyncStuff() { var res = await something.. //this code will not respect the actor concurrency boundary //since it can run at the […]

如何在后台运行非必要的计算?

这个问题是为什么这个代码同步运行? 。 我意识到我的真​​实问题比那篇文章中的问题更高。 我现在要问的问题是“我该如何做到这一点?” 我想在C#中使用并发来计算后台的东西。 我有类ptsTin,它代表现有的地面。 我想尽快加载。 有些工作是必不可少的,因为在工作完成之前你没有实例。 例如,直到.LoadPoints()和.LoadTriangles都完成后才会有ptsTin实例。 工作的其他部分不是必需的,可以在以后计算,即使以后是0.2秒。 我想在一个新的线程中开始非必要的工作而忘记它。 如果它正在处理的值尚未就绪,则该值将为null。 所以这就是我想做的事情。 代码现在位于控制台应用程序中,但有一天会在GUI应用程序中。 注意,这是伪代码 。 我知道它不会像这样工作,它的目的是传达我想知道如何做的事情: static void Main(string[] args) { var myTin = ptsDTM.Load(“SomeFile.ptsTin”); // Do other stuff here like getElevationAtAPoint(); } public static ptsTin Load(String file) { // Essential Work ptsTin newTin = new ptsTin(); newTin.LoadPoints(file); newTin.LoadTriangles(file); // At this point I […]

System.IO.IOException:’进程无法访问文件’@ .txt’,因为它正被另一个进程使用。

我是编程新手,我有一个问题。 如果我有两个函数,一个创建一个文本文件并写入其中,而另一个打开相同的文本文件并从中读取。 我得到的错误是: System.IO.IOException:’进程无法访问文件’@ .txt’,因为它正被另一个进程使用。 我已经尝试为每个function设置单独的计时器,但它仍然无效。 我认为最好的方法是函数2在函数1结束之前不会启动。 你能帮助我实现这个目标吗? 非常感谢你! 麦克风 源代码: public Form1() { InitializeComponent(); System.Timers.Timer timerButtona1 = new System.Timers.Timer(); timerButtona1.Elapsed += new ElapsedEventHandler(tickTimera1); timerButtona1.Interval = 3003; timerButtona1.Enabled = true; } private async void tickTimera1(object source, ElapsedEventArgs e) { function1(); function2(); } void function1() { List linki = new List(); linki.Add(“https://link1.net/”); linki.Add(“https://link2.net/”); linki.Add(“https://link3.net/”); List fileNames […]

使用StreamReader进行并发文件访问时引发exception

我发现了一篇关于使用StreamWriter处理并发文件访问的post 。 问题是答案不管理正在访问文件但多个进程的场景。 我们稍后告诉它: 我有多个应用程序 我需要在dataBase中使用集中式日志记录系统 如果数据库失败,我需要回退文件系统日志 存在一种已知的并发方案,其中多个应用程序(进程)将尝试在该文件中写入。 这可以通过在短暂延迟后重新尝试写入来管理。 但如果是安全错误或文件名语法错误,我不想重新尝试。 代码在这里: // true if an access error occured bool accessError = false; // number fo writing attemps int attempts = 0; do { try { // open the file using (StreamWriter file = new StreamWriter(filename, true)) { // write the line file.WriteLine(log); // success result […]

在ASP.NET Core中启用来自同一会话的并发请求

编辑:这显然是在浏览器中测试的问题,而不是代码。 默认情况下,Core中的会话将被禁用。 原始问题: 我正在开发一个Web API,它需要同时处理多个请求,即使是来自同一个客户端。 它是一个ASP.NET核心MVC(1.1.2)应用程序,目前针对完整框架(4.5.2),主要是为了与其他库兼容。 当我第一次测试我的并发性时,我很惊讶这些请求根本不是并发的。 我用Google搜索并发现ASP.NET不会同时处理会话中的请求,而是将它们排队。 快速测试表明会话可能是罪魁祸首: [HttpGet(“sleep”)] public string Sleep() { Thread.Sleep(5000); return $”Done at {DateTime.Now:u}”; } 当我从同一浏览器中的多个选项卡快速请求时,每个选项卡之间需要5秒钟。 当我使用多个浏览器时,情况并非如此,它会在5秒钟内响应多次。 在搜索解决方案时,我一直在寻找在ASP.NET中禁用会话状态的方法,但对Core来说却没有。 就会话而言,我使用的是默认的API项目模板,而我没有采取任何措施来专门启用/设置会话状态。 有没有办法摆脱ASP.NET Core中的会话状态? 或者是否有更好的解决方案来启用并发请求?

nservicebus并发访问saga数据

我使用NServiceBus作为企业服务总线,在我正在开发的解决方案中,我有一个编排服务,它从所有客户端应用程序接收多达10k条消息。 我想提高架构性能,从而增强所提供的解决方案。 我使用Saga Data类,我想在所有工作线程之间共享对它的访问(到目前为止我只设置一个线程但我想设置至少10个),当多个线程尝试访问时会发生什么同样的传奇? NSB是否已经提供了这样的并发function? 我必须自己实施吗? 如果后者有任何提示? 提前致谢

如何正常卸载已运行线程的子AppDomain

我有一个加载子AppDomain的服务,然后启动一个在其中运行的线程。 它需要一个AppDomain,因为它动态生成并加载一些代码,我需要能够重新启动它而不会终止整个服务。 因此,在子AppDomain的事件循环中运行一个线程,它通过MarshalByRefObject传递给它的事件,MarshalByRefObject将东西粘在并发队列中。 我想停止并卸载子AppDomain并创建一个新的AppDomain。 我可以简单地在子AppDomain上调用Unload,但这将中止所有线程并抛出ThrearAbortException。 我怎样才能优雅地把它关掉? 如果我使用MarshalByRefObject在子AppDomain中设置一些静态标志,那么主进程如何能够等到它完成卸载? 我有一些示例代码,它显示了它的设置以及如何调用Unload来杀死它,我怎么能修改它以允许正常卸载并且永远不会有多个子AppDomains? using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security; using System.Security.Permissions; using System.Reflection; using System.Threading; namespace TestAppDomains { /// /// Calls to methods magically get transfered to the appdomain it was created in because it derives from MarshalByRefObject /// class MarshalProxy : MarshalByRefObject { public AppDomain […]

db4o客户端/服务器似乎一次只能处理一个查询?

我们正在评估db4o(来自http://www.db4o.com的OO-DBMS)。 我们已经针对客户端/服务器模式进行了性能测试,我们将服务器启动,然后立即与几个客户端进行对话。 看起来服务器一次只能处理一个客户端的查询。 我们是否错过了允许这种情况的配置开关? 服务器实现如下。 客户端连接,查询(只读)和断开每个操作,并且操作在客户端进程中的多个工作线程之后立即运行。 如果我们将一个客户端进程分别针对同一个服务器,则我们会看到相同的行为。 有什么建议? 编辑:我们现在已经发现并尝试了Lazy和Snapshot QueryModes,尽管这可以缓解阻塞服务器问题(部分),但是当我们的客户端(我们运行40个等待1的并发测试客户端)时,我们仍然会看到严重的并发问题在发出随机操作请求之前-300ms锤击服务器。 似乎有来自LINQ提供程序和IO内部的exception:-( public class Db4oServer : ServerConfiguration, IMessageRecipient { private bool stop; #region IMessageRecipient Members public void ProcessMessage(IMessageContext con, object message) { if (message is StopDb4oServer) { Close(); } } #endregion public static void Main(string[] args) { //Ingestion.Do(); new Db4oServer().Run(true, true); } public void Run(bool shouldIndex, […]

TPL数据流加速?

我想知道以下代码是否可以优化以更快地执行。 在一个非常简单的数据流结构中,我目前似乎每秒大约有140万条简单消息。 我知道这个示例进程同步传递/转换消息,但是,我目前正在测试TPL Dataflow作为我自己的基于任务和并发集合的自定义解决方案的替代。 我知道术语“并发”已经建议我并行运行,但是出于当前的测试目的,我通过同步推送消息在我自己的解决方案上,每秒我得到大约510万条消息。 我在这里缺少什么,我读到TPL Dataflow被推为高吞吐量,低延迟的解决方案,但到目前为止我必须忽略性能调整。 有谁能指出我正确的方向吗? class TPLDataFlowExperiments { public TPLDataFlowExperiments() { var buf1 = new BufferBlock(); var transform = new TransformBlock(t => { return “”; }); var action = new ActionBlock(s => { //Thread.Sleep(100); //Console.WriteLine(s); }); buf1.LinkTo(transform); transform.LinkTo(action); //Propagate all Completions down the flow buf1.Completion.ContinueWith(t => { transform.Complete(); transform.Completion.ContinueWith(u => { action.Complete(); […]