2012-01-12 2 views
4

У меня есть экземпляр класса, к которому можно получить доступ несколькими потоками.Образец шаблона многопоточности

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

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

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

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

Есть статический IDictionary<int, TObjectStore> где int является идентификатор потока, и получить доступ к этому с помощью некоторого метода или геттер:

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 просто подберет ее?

Благодаря

ответ

7

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

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

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

+0

TIL о 'ThreadLocal <>' –

Смежные вопросы