C#, выходящий из использования () блок с потоком, все еще работающим на ограниченном по объему объекте

Вот что мы все хотим:

function Enum(constantsList) {
    for (var i in constantsList) {
        this[constantsList[i]] = i;
    }
}

Теперь вы можете создавать свои перечисления:

var YesNo = new Enum(['NO', 'YES']);
var Color = new Enum(['RED', 'GREEN', 'BLUE']);

Таким образом, к константам можно обращаться обычным способом (Да Нет. ДА , Color.GREEN) и они получают последовательное значение типа int (NO = 0, YES = 1; RED = 0, GREEN = 1, BLUE = 2).

Вы также можете добавить методы, используя Enum.prototype:

Enum.prototype.values = function() {
    return this.allValues;
    /* for the above to work, you'd need to do
            this.allValues = constantsList at the constructor */
};


Редактировать - небольшое улучшение - теперь с varargs: (к сожалению, это не работает должным образом в IE: S ... следует придерживаться предыдущей версии)

function Enum() {
    for (var i in arguments) {
        this[arguments[i]] = i;
    }
}

var YesNo = new Enum('NO', 'YES');
var Color = new Enum('RED', 'GREEN', 'BLUE');
15
задан yitz 23 June 2009 в 14:01
поделиться

4 ответа

Произойдут интересные вещи.

В частности, метод dispose для SomeObject будет вызываться либо до, либо после вызова Work, поскольку он мог или не мог быть запланирован для этого точка.

После этого это зависит от того, что делает метод удаления SomeObject; если он, скажем, освобождает SqlConnection, который не используется в «Работе», тогда проблем быть не должно; Однако если SomeObject ожидает, что он не был удален, вы, вероятно, получите исключение в этом потоке.

11
ответ дан 1 December 2019 в 04:01
поделиться

Помните, что IDisposable - это просто шаблон и не освобождает память, связанную с объектом. В этом случае закрытие блока using вызовет obj.Dispose , а другой поток, использующий obj , продолжит выполнение.

Это создаст для вас странные проблемы, поскольку состояние obj может быть изменено, пока другой поток его использует (все зависит от того, как реализован метод Dispose ). Излишне говорить, что это приложение IDisposable , threading и using оператор будет в лучшем случае проблематичным.

4
ответ дан 1 December 2019 в 04:01
поделиться

Объект вызовет Dispose в конце блока. Он продолжит работу, но obj станет нестабильным, поскольку Dispose предполагает закрытие соединений и т. Д. Теперь возможно, что obj будет настроен для проверки того, что что-то используется, и закрытия его впоследствии, но я бы не стал на это рассчитывать, если только вы написали объект, чтобы справиться с этим.

2
ответ дан 1 December 2019 в 04:01
поделиться

При выходе из блока using в основном потоке он вызывает .Dispose () объект, что может вызвать всевозможные забавные проблемы с параллелизмом. Однако объект не будет собираться сборщиком мусора - он останется, но в недопустимом состоянии, в зависимости от вашей реализации .Dispose ().

1
ответ дан 1 December 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: