小编mik*_*010的帖子

在相等性测试中使用字符串文字是否会创建新字符串?

每次调用方法并将其计算为true时,以下代码是否会创建3个新字符串,或者编译是否足够聪明以将右侧字符串编译为常量?

if (somestring == "Test" || someString == "Test1")
{
   ...
   NotifyPropertyChanged("Name");
}
Run Code Online (Sandbox Code Playgroud)

.net c#

2
推荐指数
2
解决办法
118
查看次数

将 ItemsControl ContentPresenter 完全替换为正在呈现的控件

我正在使用 ItemsControl 根据我的模型生成控件列表。在查看可视化树时,我注意到每个呈现的控件都包含在一个 ContentPresenter 中。添加的控件是第 3 方控件,旨在在每个控件之间显示一个分隔符(如果它们是同级控件)。这允许用户调整每个控件的大小。例如,下面将显示运行时每个控件之间的分隔符。

<StackPanel>
<3rdPartyControl />
<3rdPartyControl />
<3rdPartyControl />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

使用 ItemsControl 时,每个 3rdPartyControl 都包装在 ContentPresenter 中,因此不显示拆分器。我尝试了各种方法来尝试解决这个问题,但除非我编写代码来添加每个控件而不是依赖 Xaml,否则无法使其正常工作。有谁知道完全替换 contentpresenter 的方法(在我的情况下是 3rdpartyControl)?

谢谢

c# silverlight wpf xaml

2
推荐指数
1
解决办法
1479
查看次数

在C#中,Do事件是否保留对回调方法所在的整个类的引用?

我有一个将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事件

.net c# memory memory-leaks memory-management

1
推荐指数
1
解决办法
753
查看次数

为什么Parallel.Foreach会创建无穷无尽的线程?

下面的代码继续创建线程,即使队列是空的.最终会发生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)

.net c# multithreading task-parallel-library

1
推荐指数
1
解决办法
1677
查看次数