到目前为止,我没有遇到任何问题使用相同的锁定多种方法,但我想知道以下代码是否可能确实存在我不知道的问题(性能?):
private static readonly object lockObj = new object();
public int GetValue1(int index)
{
lock(lockObj)
{
// Collection 1 read and/or write
}
}
public int GetValue2(int index)
{
lock(lockObj)
{
// Collection 2 read and/or write
}
}
public int GetValue3(int index)
{
lock(lockObj)
{
// Collection 3 read and/or write
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,3种方法和集合都没有关系.
另外,如果lockObj单例也使用它(在Instance属性中)会是一个问题吗?
编辑:澄清我在Singleton类中使用相同锁对象的问题:
private static readonly object SyncObject = new object();
public static MySingleton Instance
{
get
{
lock (SyncObject)
{
if (_instance == …Run Code Online (Sandbox Code Playgroud) 我正在为我的图表使用' System.Windows.Forms.DataVisualization.Charting '库,我想知道是否有人想出如何切换轴以垂直显示图表
谢谢.

对不起,如果这听起来很简单,但我正在寻找一些帮助来改善我的代码:)
所以我目前有以下实现(我也写过):
public interface IOptimizer
{
void Optimize();
string OptimizerName { get; }
}
public abstract AbstractOptimizer : IOptimizer
{
public void Optimize()
{
// General implementation here with few calls to abstract methods
}
}
public abstract AbstractPriorityOptimizer : AbstractOptimizer
{
// Optimize according to priority criteria.
string Name
{
get { return "Priority Optimizer"; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有技术特定的具体课程:
TechnologyXPriorityOptimizer : AbstractPriorityOptimizer
TechnologyYPriorityOptimizer : AbstractPriorityOptimizer
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试添加一个通用优化器,一个优化优先级以外的条件的优化器,所以我的尝试:
public abstract AbstractGenericOptimizer : AbstractOptimizer
{
// Optimize according to a generic criteria. …Run Code Online (Sandbox Code Playgroud) 我有一个在特定高度和特定温度下运行的模拟:
interface IGeneratable
{
string Name { get; }
void Generate();
}
interface ISimulation : IGeneratable
{
int Height { get; }
int Temperature { get; }
}
Run Code Online (Sandbox Code Playgroud)
的Generate()用于模拟典型的过程包括多个步骤:
void Generate()
{
Step1();
Step2();
Step3();
}
Run Code Online (Sandbox Code Playgroud)
现在,用户可以指定多个高度和/或多个温度.
在这种情况下,产生多个模拟(子模拟),每个高度/温度组合一个.
interface IMultiSimulation : IGeneratable
{
ISimulation[] SubSimulations { get; }
}
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,子模拟的Generate()方法与Step1,Step2,Step3顺序不同:
Step2()仅需要对所有子模拟执行一次,而不是每个温度执行一次(即每次多次模拟一次).Step1() 首先为所有子模拟预先计算.一般注意事项
IStep其中,实现IGeneratable.因此,模拟可以返回例如步骤列表.我一直在尝试使用装饰模式,但没有成功.
我正在寻找一个适当的模式,其可扩展的解决方案可以处理单个模拟的生成以及多个模拟.
谢谢.
是否可以解决以下0-1背包问题:
我平均有10个项目,所以我正在考虑使用暴力实施.但是,我想知道是否有更好的方法.
我已经分析了我的应用程序并运行了一些性能测试,这使我相信以下if-lock-if安排:
private float GetValue(int id)
{
float value;
if (!dictionary.TryGetValue(id, out value))
{
lock (lockObj)
{
if (!dictionary.TryGetValue(id, out value))
{
value = ComputeValue(id);
dictionary.Add(id, value);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
似乎比"lock-if"或使用ReaderWriterLockSlim执行得更快.但很少,我得到以下异常:
1) Exception Information
*********************************************
Exception Type: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Data: System.Collections.ListDictionaryInternal
TargetSite: Int32 FindEntry(TKey)
HelpLink: NULL
Source: mscorlib
StackTrace Information
*********************************************
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at MyNamespace.GetValue()
.....
.....
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
编辑:澄清一下,这种方法的平均调用次数超过5000万次,冲突一般不到5000次.
谢谢
我的代码处理大量的值,我正在寻找一个有效的结构来跟踪顶部(N)值,其中N小于10,所以收集所有数字然后排序列表并取第一个(N)可能不是最有效的方式.
为此,我正在构建一个固定大小为N的集合,以保持顶部(N)值按降序排序.Add(T value)如果value高于任何现有值(在这种情况下删除最后一个元素)或者集合未满,则排序集合的方法会将值添加到集合中.
LinkedList<T>由于它具有快速插入和删除功能,因此我能够实现我想要的加倍,但我想知道使用SortedDictionary<TKey, TValue>或优先级队列是否会更好?
谢谢.
我编写了以下代码来生成[0,int.MaxValue]范围内的随机数,但我不确定如何在保持均匀分布的同时将范围限制为[0,randomMax]:
private static int GetNextInt32(this RNGCryptoServiceProvider random)
{
var buffer = new byte[sizeof(int)];
random.GetBytes(buffer);
return Math.Abs(BitConverter.ToInt32(buffer, 0));
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有以下模拟数据:
interface ISimulationData
{
string Name { get; }
int[] Heights { get; }
int[] Temperatures { get; }
}
Run Code Online (Sandbox Code Playgroud)
以下用于生成的界面:
interface ISimulation
{
void Generate();
}
Run Code Online (Sandbox Code Playgroud)
使用Composite模式表示单个或多个模拟:
interface ISimpleSimulation : ISimulation
{
int Height { get; }
int Temperature { get; }
}
interface IMultiSimulation : ISimulation
{
IEnumerable<ISimulation> GetSimulations();
}
Run Code Online (Sandbox Code Playgroud)
我有以下工厂界面:
interface ISimulationFactory
{
ISimulation CreateSimulation(ISimulationData simulationData);
}
Run Code Online (Sandbox Code Playgroud)
模拟类型的具体实现:
class SimpleSimulation : ISimpleSimulation
{
public int Height { get; set; }
public int Temperature …Run Code Online (Sandbox Code Playgroud) 对于一小组键/值对(默认值2,最大值为5),a Dictionary<TKey, TValue>似乎有点矫枉过正.是否有一个更简单的数据结构可以在我的情况下使用?我正在为某些对象(即<MyClass, double>)缓存计算值,因此检索速度很重要.
谢谢
c# ×8
.net ×2
algorithm ×2
composite ×2
decorator ×2
dictionary ×2
locking ×2
performance ×2
arrays ×1
bar-chart ×1
builder ×1
charts ×1
collections ×1
factory ×1
lookup ×1
memory ×1
random ×1
simulation ×1
sorting ×1