2009-05-28 5 views

ответ

10

Interlocked.Exchange. Это делает это в потокобезопасном атомарном вызове.


Edit после комментариев:

Просто чтобы прояснить, как это работает, используя Interlocked.Exchange, вы могли бы сделать:

left = Interlocked.Exchange(ref right, left); 

Это будет эквивалентно (в действительности) делать:

Swap(ref left, ref right); 

Однако Interlocked.Exchange делает это как атомную операцию, поэтому она является потокобезопасной.

+1

Interlocked.Exchange устанавливает значение, оно фактически не меняет значения. Вам все равно нужно сохранить временную задержку и дважды вызвать Interlocked.Exchange, так что вы ничего не получите. – jrista

+1

Interlocked.Exchange на самом деле не эквивалентен указанной Swap. Он меняет только первое значение и не касается второго (самого себя). –

+1

@Mehdrad: left = InterlockedExchange (правый правый, левый); –

3

Нет, у рамки нет такого метода. Вероятно, причина в том, что нет большой выгоды, чтобы встроить его, и вы могли бы легко (как и вы) добавить его сами. Это также требует использования ref в качестве параметра, что значительно ограничит использование. Например, вы не могли этого сделать:

List<int> test; 
// ... 
Swap(ref test[0], ref test[1]); // won't work, it's an indexer, not an array