草庐IT

c# - 在 parallel.foreach 范围之外递增计数值

如何在parallel.foreach循环范围之外递增整数值?在并行循环之外同步访问对象的最简单方法是什么?varcount=0;Parallel.ForEach(collection,item=>{action(item);//incrementcount??} 最佳答案 我喜欢打死马!:)从多个线程递增计数的“最简单”方法是:Interlocked.Increment(refcount);但正如其他人指出的那样:如果您在Parallel.ForEach中执行此操作,那么您可能做错了什么。我怀疑出于某种原因你正在使用ForEach

c# - 为什么我这里有锁?

请参阅以下表示并行foreach完成的工作的并发性能分析:在循环内,每个线程从数据库中读取数据并进行处理。线程之间没有锁,因为每个线程处理不同的数据。由于未知原因,似乎在foreach的所有线程中都有周期性锁定(请参见黑色垂直矩形)。如果您看到选定的锁定段(深红色段),您将看到堆栈显示锁定在StockModel.Quotation构造函数的线程。那里的代码只是构造了两个空列表!我在某处读到这可能是由GC引起的,所以我将垃圾收集更改为在服务器模式下运行:我得到了一点改进(大约快了10%-15%),但我仍然到处都有垂直锁。我还向所有数据库查询添加了WITH(NOLOCK),因为我只是在读取

c# - 为什么我这里有锁?

请参阅以下表示并行foreach完成的工作的并发性能分析:在循环内,每个线程从数据库中读取数据并进行处理。线程之间没有锁,因为每个线程处理不同的数据。由于未知原因,似乎在foreach的所有线程中都有周期性锁定(请参见黑色垂直矩形)。如果您看到选定的锁定段(深红色段),您将看到堆栈显示锁定在StockModel.Quotation构造函数的线程。那里的代码只是构造了两个空列表!我在某处读到这可能是由GC引起的,所以我将垃圾收集更改为在服务器模式下运行:我得到了一点改进(大约快了10%-15%),但我仍然到处都有垂直锁。我还向所有数据库查询添加了WITH(NOLOCK),因为我只是在读取

c# - 如何检测来自 WPF 应用程序的“锁定此计算机”命令?

更喜欢使用WPF的C#、.Net3.5中的答案(Windows窗体也可以)我有一个本质上是工具栏窗口或托盘图标的应用程序。它需要检测用户是否锁定了他/她的工作站并走开了,以便在集中式系统中更新此人的状态。使用SystemEvents,我可以很容易地检测到session切换或注销,但我终究无法弄清楚如何检测或接收Lock事件。感谢您的帮助。 最佳答案 当你处理Microsoft.Win32.SystemEvents.SessionSwitch事件(听起来您已经在检测注销),检查Reason是否为SessionSwitchReason.

c# - 如何检测来自 WPF 应用程序的“锁定此计算机”命令?

更喜欢使用WPF的C#、.Net3.5中的答案(Windows窗体也可以)我有一个本质上是工具栏窗口或托盘图标的应用程序。它需要检测用户是否锁定了他/她的工作站并走开了,以便在集中式系统中更新此人的状态。使用SystemEvents,我可以很容易地检测到session切换或注销,但我终究无法弄清楚如何检测或接收Lock事件。感谢您的帮助。 最佳答案 当你处理Microsoft.Win32.SystemEvents.SessionSwitch事件(听起来您已经在检测注销),检查Reason是否为SessionSwitchReason.

c# - 静态方法中的 Lock()

我有一个多线程应用程序,它使用静态方法写入设置xml文件。我想避免文件同时更新两次(导致访问/写入异常)。我该怎么做?这行不通:namespaceProgram{publicclassSettings{privatestaticvoidSetSettingsValue(stringsettings,stringvalue){//makethisthreadsafetoavoidwritingtoalockedsettingsxmlfilelock(typeof(Settings)){//writedatatoxmlfile}}}} 最佳答案

c# - 静态方法中的 Lock()

我有一个多线程应用程序,它使用静态方法写入设置xml文件。我想避免文件同时更新两次(导致访问/写入异常)。我该怎么做?这行不通:namespaceProgram{publicclassSettings{privatestaticvoidSetSettingsValue(stringsettings,stringvalue){//makethisthreadsafetoavoidwritingtoalockedsettingsxmlfilelock(typeof(Settings)){//writedatatoxmlfile}}}} 最佳答案

c# - ConcurrentDictionary 线程安全到我可以将它用于静态缓存的程度吗?

基本上,如果我想执行以下操作:publicclassSomeClass{privatestaticConcurrentDictionaryCache{get;set;}}这是否让我避免到处使用lock? 最佳答案 是的,它是线程安全的,而且是的,它避免您在各处使用锁(无论那是什么意思)。当然,这只会为您提供对存储在该字典中的数据的线程安全访问,但如果数据本身不是线程安全的,那么您当然需要同步访问它。想象一下,例如,您在此缓存中存储了一个List。.现在thread1获取这个列表(以线程安全的方式,因为并发字典向你保证这一点)然后开始

c# - ConcurrentDictionary 线程安全到我可以将它用于静态缓存的程度吗?

基本上,如果我想执行以下操作:publicclassSomeClass{privatestaticConcurrentDictionaryCache{get;set;}}这是否让我避免到处使用lock? 最佳答案 是的,它是线程安全的,而且是的,它避免您在各处使用锁(无论那是什么意思)。当然,这只会为您提供对存储在该字典中的数据的线程安全访问,但如果数据本身不是线程安全的,那么您当然需要同步访问它。想象一下,例如,您在此缓存中存储了一个List。.现在thread1获取这个列表(以线程安全的方式,因为并发字典向你保证这一点)然后开始

c# - 在递归调用中使用 lock(obj)

根据我的理解,在运行时完成lock(obj)的代码块之前不会释放锁(因为当block完成时它会调用Monitor.Exit(obj)。基于这种理解,我无法理解以下代码行为背后的原因:privatestaticstringobj="";privatestaticvoidRecurseSome(intnumber){Console.WriteLine(number);lock(obj){RecurseSome(++number);}}//调用:RecurseSome(0)//输出:0123......堆栈溢出异常一定有一些我遗漏的概念。请帮忙。 最佳答案