每次调用方法并将其计算为true时,以下代码是否会创建3个新字符串,或者编译是否足够聪明以将右侧字符串编译为常量?
if (somestring == "Test" || someString == "Test1")
{
...
NotifyPropertyChanged("Name");
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 ItemsControl 根据我的模型生成控件列表。在查看可视化树时,我注意到每个呈现的控件都包含在一个 ContentPresenter 中。添加的控件是第 3 方控件,旨在在每个控件之间显示一个分隔符(如果它们是同级控件)。这允许用户调整每个控件的大小。例如,下面将显示运行时每个控件之间的分隔符。
<StackPanel>
<3rdPartyControl />
<3rdPartyControl />
<3rdPartyControl />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
使用 ItemsControl 时,每个 3rdPartyControl 都包装在 ContentPresenter 中,因此不显示拆分器。我尝试了各种方法来尝试解决这个问题,但除非我编写代码来添加每个控件而不是依赖 Xaml,否则无法使其正常工作。有谁知道完全替换 contentpresenter 的方法(在我的情况下是 3rdpartyControl)?
谢谢
我有一个将ConcurrentDictionary作为私有成员的类.该类还定义了委托/回调方法.基类将此方法注册为外部事件的回调.这只是一个ONCE.
我正在运行ANT内存分析器,我看到从ConcurrentDictionary属性的数百个实例引用了1000个MyObj实例.这些的GC根是事件回调.
这似乎导致内存在应用程序运行时显着上升.在大约5分钟左右之后,该内存的很大一部分被回收,但我担心该应用程序可能会遇到问题,因为它迅速膨胀并且在GC开始之前很久.
这里发生了什么,我该如何解决?
这是注册处理程序的基本调用的片段
protected abstract void DataReceivedEventHandler(DataChangedEvent evt);
public virtual void RegisterForChanges(ICollection<MemoryTable> tables)
{
foreach (MemoryTable table in tables)
{
_subscribedTables.Add(table);
table.RegisterEventListener(new DataChangedCallBack(this.DataReceivedEventHandler));
}
}
Run Code Online (Sandbox Code Playgroud)
这是在上面提到的基类的子类中实现的处理程序:
private ConcurrentDictionary<string, DataRecord> _cachedRecords;
protected override void DataReceivedEventHandler(DataChangedEvent evt)
{
DataRecord record = evt.Record as DataRecord;
string key = record.Key;
if (string.IsNullOrEmpty(key)) { return; }
if (_cachedRecords.ContainsKey(key))
{
_cachedRecords[key] = record;
DateTime updateTime = record.UpdateTime;
TimeSpan delta = updateTime - _lastNotifyTime;
if (delta.TotalMilliseconds > _notificationFrequency)
{
PublishData(updateTime);
}
}
}
Run Code Online (Sandbox Code Playgroud)
publishData方法发布prism事件
下面的代码继续创建线程,即使队列是空的.最终会发生OutOfMemory异常.如果我用常规foreach替换Parallel.ForEach,则不会发生这种情况.有人知道为什么会这样吗?
public delegate void DataChangedDelegate(DataItem obj);
public class Consumer
{
public DataChangedDelegate OnCustomerChanged;
public DataChangedDelegate OnOrdersChanged;
private CancellationTokenSource cts;
private CancellationToken ct;
private BlockingCollection<DataItem> queue;
public Consumer(BlockingCollection<DataItem> queue) {
this.queue = queue;
Start();
}
private void Start() {
cts = new CancellationTokenSource();
ct = cts.Token;
Task.Factory.StartNew(() => DoWork(), ct);
}
private void DoWork() {
Parallel.ForEach(queue.GetConsumingPartitioner(), item => {
if (item.DataType == DataTypes.Customer) {
OnCustomerChanged(item);
} else if(item.DataType == DataTypes.Order) {
OnOrdersChanged(item);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)