Многопоточный шаблон проектирования - PullRequest
4 голосов
/ 12 января 2012

У меня есть экземпляр класса, к которому могут обращаться несколько потоков.

Внутри этого класса находится переменная [ThreadStatic], в которой хранятся различные объекты.

Теперь мне нужен второй экземплярмоего класса, и я хочу, чтобы в нем было отдельное хранилище объектов.

В настоящее время два экземпляра в одном потоке будут совместно использовать одно и то же хранилище объектов.Я не хочу этого.

Единственное решение, о котором я могу подумать, это:

Имеет статический IDictionary<int, TObjectStore>, где int - идентификатор потока, и доступ к нему с помощью какого-либо метода илиgetter:

static TObjectStore ObjectStore {
    get {
        // create the instance here if its the first-access from this thread, with locking etc. for safety
        return objectStore[Thread.CurrentThread.Id];
    }
}

Однако проблема в том, как избавиться от TObjectStore для определенного потока, когда он заканчивается?Я думаю, что я прав, предполагая, что с моей текущей реализацией GC просто поднимет ее?

Спасибо

Ответы [ 2 ]

7 голосов
/ 12 января 2012

Статическое поле на самом деле не в любом экземпляре, поэтому я предполагаю, что теперь вам нужно поле экземпляра.В этом случае вам понадобится ThreadLocal<T>:

ThreadLocal<SomeType> store = new ThreadLocal<SomeType>( () => {
    // initializer, used when a new thread accesses the value
    return ...
});

Это хранилище будет доступно для сбора вместе с экземпляром, как и любое содержимое (если, конечно, на него больше нигде нет ссылок).

2 голосов
/ 12 января 2012

Просто чтобы дать немного больше информации в ответ Марка http://blogs.clariusconsulting.net/kzu/a-better-way-to-implement-the-singleton-anti-pattern-for-easier-testing-using-ambientsingleton/

В этой статье рассматриваются различные подходы к вашей проблеме с примерами кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...