Объекты в .NET не привязаны к квартире, если вы специально не сделаете их таковыми.
Например, если вы используете локальное хранилище потоков, у вас будут проблемы с несколькими потоками, обращающимися к объекту, если вы предполагаете, что весь доступ к объекту будет происходить в одном потоке.
С другой стороны, локальное хранилище потоков может быть функцией, при которой использование объекта в нескольких потоках обрабатывается, по крайней мере, частично отдельно.
Что касается других ваших дел, давайте рассмотрим их по одному с комментариями:
А как насчет произвольных объектов? Как насчет:
public class MyClass
{
int _number;
public int Number { get { return _number; } set { _number = value; } }
}
MyClass myObject = new MyClass();
Пока я синхронизирую доступ к myObject, двум потокам разрешено общаться с ним?
Ответ : Да, и в этом случае необходимость синхронизации зависит от ваших требований.
Если вы по срокам абсолютно обязаны гарантировать, что если в одном потоке установить новое значение в объекте, а в другом - прочитать его сразу после установки (но двух разных потоков), вам потребуется второй поток для чтения значения первый вставлен, затем вам нужно заблокировать.
Однако сохранение значения для int является атомарной операцией. Блокировка необходима для получения барьера памяти, чтобы при чтении значения во втором потоке не использовалась кэшированная копия.
Обычно вы можете обходиться с такими простыми классами, просто объявляя вещи изменчивыми, но блокировка - верный способ сделать лучшие гарантии.
Для более сложного объекта, скажем, установка структуры, превышающей собственный размер шины процессора (т. Е. Больше 32 или 64-битной в зависимости от), требуется блокировка, так как данные копируются в нужное место в памяти не атомарная операция в таком случае. Другими словами, без блокировки вы рискуете прочитать половину старых, наполовину новых данных, если один поток попытается прочитать данные в середине операции записи, выполняющейся в другом потоке.
То же самое касается:
List<Object> sharedList = new List<Object>();
Два потока могут общаться со списком, если они не делают это одновременно, обычно с:
lock (sharedList)
{
sharedList.Add(data);
}
разрешено ли двум потокам касаться одного и того же объекта?
Ответ : Да. Обычно рекомендуется использовать свойство SyncRoot интерфейса ICollection в коллекциях или просто использовать другой объект блокировки.
То же самое касается:
IAsyncResult ar = BeginSetLabelToTheValueINeed(label1);
...
EndSetLabelToTheValueINeed(ar);
Ответ : В этом я не уверен, какая именно здесь проблемная переменная? Если label1
, то здесь нет ничего, что мешало бы нескольким потокам обращаться к этой переменной и связываться с ней, и вам необходимо использовать механизмы блокировки для предотвращения таких проблем.
То же самое касается:
//Fetch image on connection that is an existing DB transaction
public static Bitmap GetImageThumbnail(DbConnection conn, int imageID)
{
}
преобразуется в шаблон асинхронного делегата:
//Begin fetching an image on connection that is an existing DB transaction
IAsyncResult ar = BeginGetImageThumbnuts(conn, imageID, callback, stateOjbect);
...
//Finish fetching an image on connection that is an existing DB transaction
Bitmap thumb = EndGetImageNumbthail(ar);
Ответ : Если под этим вы подразумеваете, что будете выполнять несколько таких запросов параллельно, вы, вероятно, не получите много, так как вам нужно будет сериализовать доступ к объекту соединения, так как они не ' Это безопасно. Возможно, вам лучше сделать метод миниатюр открытым и закрыть свое собственное соединение.
Если, конечно, вы хотите использовать только одно соединение и вместо этого сериализовать этот доступ, но распараллелить вычисление миниатюры, но поскольку эти потоки будут каким-то образом выполняться последовательно, так как большинство из них ждут первого завершив доступ к соединению, вы, скорее всего, не получите здесь много.
Короче говоря, блокировка, как правило, очень проста в реализации и почти всегда дает хорошие гарантии того, что вы не можете испортить объект, получив к нему доступ из двух потоков.