Медленное Свойство Applicationsettingsbase


Механизм настройки приложений (производный от ApplicationSettingsBase), по-видимому, является реальным узким местом при использовании в многопоточных сценариях. Особенно, когда свойства запрашиваются часто, параллелизм, который они вводят, замедляет мои циклы. Мне нравится использовать их в любом случае, чтобы иметь те хорошие опции конфигурации приложений. Но, может быть, мне нужно завернуть их в свой собственный тайник или что-то в этом роде?

У кого-нибудь есть такая же проблема? Я что-то упустил? Я подумал, что заявки на создание базы данных кэширует ли уже все настройки? Почему кажется, что он вообще блокирует доступ из нескольких потоков? Что может быть общим обходным путем?

2 4

2 ответа:

Я не вижу ничего странного в наличии потокобезопасных настроек mechanismm? Если это замедляет ваши hihgly параллельные theads вниз, вы должны попытаться использовать локальные переменные istead запроса getsetting fast снова. Я думаю, что редизайн вашего механизма запроса настроек значительно улучшит производительность.

Я бы действительно предложил обернуть любую функциональность "get settings" в объект и спрятать ее за интерфейсом. Мы сильно набираем это, поэтому у нас есть:

public class Worker 
{
    private readonly ISettings settings;
    public Worker (ISettings settings)
    {
        this.settings = settings;
    }

    public void Work ()
    {
        for (int i = 0; i < settings.MaxWorkerIterations (); i++)
        { ... }
    }
}

public interface ISettings
{
    int MaxWorkerIterations ();
}

public class AppConfigSettings
{
    public int MaxWorkerIterations ()
    {
        return (int) ApplicationSettings["MaxWorkerIterations"];
    }
}

Это имеет преимущество (в основном) проверки во время компиляции и простоты тестирования. Вы также можете переопределить свой класс AppConfigSettings, чтобы он был классом CachingAppConfigSettings, который делает очевидное.