Interlocked.Exchange 方法 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
将变量设置为指定值作为原子操作。
重载
| Exchange(UInt16, UInt16) | 将 16 位有符号整数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(UInt32, UInt32) | 将 32 位无符号整数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(Single, Single) | 将单精度浮点数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(UIntPtr, UIntPtr) | 将特定于平台的句柄或指针设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(UInt64, UInt64) | 将 64 位无符号整数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(SByte, SByte) | 将 8 位有符号整数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(Byte, Byte) | 将 8 位无符号整数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(IntPtr, IntPtr) | 将特定于平台的句柄或指针设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(Int64, Int64) | 将 64 位有符号整数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(Int32, Int32) | 将 32 位有符号整数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(Int16, Int16) | 将 16 位无符号整数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(Double, Double) | 将双精度浮点数设置为指定值,并将原始值作为原子操作返回。 | 
| Exchange(Object, Object) | 将对象设置为指定的值,并将对原始对象的引用作为原子操作返回。 | 
| Exchange<T>(T, T) | 将指定类型的变量  | 
Exchange(UInt16, UInt16)
重要
此 API 不符合 CLS。
将 16 位有符号整数设置为指定值,并将原始值作为原子操作返回。
public:
 static System::UInt16 Exchange(System::UInt16 % location1, System::UInt16 value);[System.CLSCompliant(false)]
public static ushort Exchange (ref ushort location1, ushort value);[<System.CLSCompliant(false)>]
static member Exchange : uint16 * uint16 -> uint16Public Shared Function Exchange (ByRef location1 As UShort, value As UShort) As UShort参数
- location1
- UInt16
要设置为指定值的变量。
- value
- UInt16
设置 location1 参数的值。
返回
              location1的原始值。
- 属性
例外
location1 的地址是 null 指针。
适用于
Exchange(UInt32, UInt32)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
重要
此 API 不符合 CLS。
将 32 位无符号整数设置为指定值,并将原始值作为原子操作返回。
public:
 static System::UInt32 Exchange(System::UInt32 % location1, System::UInt32 value);[System.CLSCompliant(false)]
public static uint Exchange (ref uint location1, uint value);[<System.CLSCompliant(false)>]
static member Exchange : uint32 * uint32 -> uint32Public Shared Function Exchange (ByRef location1 As UInteger, value As UInteger) As UInteger参数
- location1
- UInt32
要设置为指定值的变量。
- value
- UInt32
设置 location1 参数的值。
返回
              location1的原始值。
- 属性
例外
              location1 的地址是 null 指针。
适用于
Exchange(Single, Single)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
将单精度浮点数设置为指定值,并将原始值作为原子操作返回。
public:
 static float Exchange(float % location1, float value);public static float Exchange (ref float location1, float value);static member Exchange : single * single -> singlePublic Shared Function Exchange (ByRef location1 As Single, value As Single) As Single参数
- location1
- Single
要设置为指定值的变量。
- value
- Single
设置 location1 参数的值。
返回
              location1的原始值。
例外
              location1 的地址是 null 指针。
另请参阅
适用于
Exchange(UIntPtr, UIntPtr)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
重要
此 API 不符合 CLS。
将特定于平台的句柄或指针设置为指定值,并将原始值作为原子操作返回。
public:
 static UIntPtr Exchange(UIntPtr % location1, UIntPtr value);[System.CLSCompliant(false)]
public static UIntPtr Exchange (ref UIntPtr location1, UIntPtr value);[<System.CLSCompliant(false)>]
static member Exchange : unativeint * unativeint -> unativeintPublic Shared Function Exchange (ByRef location1 As UIntPtr, value As UIntPtr) As UIntPtr参数
- location1
- 
				
				UIntPtr
unativeint 
要设置为指定值的变量。
- value
- 
				
				UIntPtr
unativeint 
设置 location1 参数的值。
返回
unativeint
              location1的原始值。
- 属性
例外
              location1 的地址是 null 指针。
适用于
Exchange(UInt64, UInt64)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
重要
此 API 不符合 CLS。
将 64 位无符号整数设置为指定值,并将原始值作为原子操作返回。
public:
 static System::UInt64 Exchange(System::UInt64 % location1, System::UInt64 value);[System.CLSCompliant(false)]
public static ulong Exchange (ref ulong location1, ulong value);[<System.CLSCompliant(false)>]
static member Exchange : uint64 * uint64 -> uint64Public Shared Function Exchange (ByRef location1 As ULong, value As ULong) As ULong参数
- location1
- UInt64
要设置为指定值的变量。
- value
- UInt64
设置 location1 参数的值。
返回
              location1的原始值。
- 属性
例外
              location1 的地址是 null 指针。
适用于
Exchange(SByte, SByte)
重要
此 API 不符合 CLS。
将 8 位有符号整数设置为指定值,并将原始值作为原子操作返回。
public:
 static System::SByte Exchange(System::SByte % location1, System::SByte value);[System.CLSCompliant(false)]
public static sbyte Exchange (ref sbyte location1, sbyte value);[<System.CLSCompliant(false)>]
static member Exchange : sbyte * sbyte -> sbytePublic Shared Function Exchange (ByRef location1 As SByte, value As SByte) As SByte参数
- location1
- SByte
要设置为指定值的变量。
- value
- SByte
设置 location1 参数的值。
返回
              location1的原始值。
- 属性
例外
location1 的地址是 null 指针。
适用于
Exchange(Byte, Byte)
将 8 位无符号整数设置为指定值,并将原始值作为原子操作返回。
public:
 static System::Byte Exchange(System::Byte % location1, System::Byte value);public static byte Exchange (ref byte location1, byte value);static member Exchange : byte * byte -> bytePublic Shared Function Exchange (ByRef location1 As Byte, value As Byte) As Byte参数
- location1
- Byte
要设置为指定值的变量。
- value
- Byte
设置 location1 参数的值。
返回
              location1的原始值。
例外
location1 的地址是 null 指针。
适用于
Exchange(IntPtr, IntPtr)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
将特定于平台的句柄或指针设置为指定值,并将原始值作为原子操作返回。
public:
 static IntPtr Exchange(IntPtr % location1, IntPtr value);public static IntPtr Exchange (ref IntPtr location1, IntPtr value);static member Exchange : nativeint * nativeint -> nativeintPublic Shared Function Exchange (ByRef location1 As IntPtr, value As IntPtr) As IntPtr参数
- location1
- 
				
				IntPtr
nativeint 
要设置为指定值的变量。
- value
- 
				
				IntPtr
nativeint 
设置 location1 参数的值。
返回
nativeint
              location1的原始值。
例外
              location1 的地址是 null 指针。
另请参阅
适用于
Exchange(Int64, Int64)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.CoreCLR.cs
将 64 位有符号整数设置为指定值,并将原始值作为原子操作返回。
public:
 static long Exchange(long % location1, long value);public static long Exchange (ref long location1, long value);static member Exchange : int64 * int64 -> int64Public Shared Function Exchange (ByRef location1 As Long, value As Long) As Long参数
- location1
- Int64
要设置为指定值的变量。
- value
- Int64
设置 location1 参数的值。
返回
              location1的原始值。
例外
              location1 的地址是 null 指针。
另请参阅
适用于
Exchange(Int32, Int32)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.CoreCLR.cs
将 32 位有符号整数设置为指定值,并将原始值作为原子操作返回。
public:
 static int Exchange(int % location1, int value);public static int Exchange (ref int location1, int value);static member Exchange : int * int -> intPublic Shared Function Exchange (ByRef location1 As Integer, value As Integer) As Integer参数
- location1
- Int32
要设置为指定值的变量。
- value
- Int32
设置 location1 参数的值。
返回
              location1的原始值。
例外
              location1 的地址是 null 指针。
              location1 的地址是 null 指针。
示例
下面的代码示例演示线程安全资源锁定机制。
using namespace System;
using namespace System::Threading;
const int numThreads = 10;
const int numThreadIterations = 5;
ref class MyInterlockedExchangeExampleClass
{
public:
   static void MyThreadProc()
   {
      for ( int i = 0; i < numThreadIterations; i++ )
      {
         UseResource();
         
         //Wait 1 second before next attempt.
         Thread::Sleep( 1000 );
      }
   }
private:
   //A simple method that denies reentrancy.
   static bool UseResource()
   {
      
      //0 indicates that the method is not in use.
      if ( 0 == Interlocked::Exchange( usingResource, 1 ) )
      {
         Console::WriteLine( " {0} acquired the lock", Thread::CurrentThread->Name );
         
         //Code to access a resource that is not thread safe would go here.
         //Simulate some work
         Thread::Sleep( 500 );
         Console::WriteLine( " {0} exiting lock", Thread::CurrentThread->Name );
         
         //Release the lock
         Interlocked::Exchange( usingResource, 0 );
         return true;
      }
      else
      {
         Console::WriteLine( " {0} was denied the lock", Thread::CurrentThread->Name );
         return false;
      }
   }
   //0 for false, 1 for true.
   static int usingResource;
};
int main()
{
   Thread^ myThread;
   Random^ rnd = gcnew Random;
   for ( int i = 0; i < numThreads; i++ )
   {
      myThread = gcnew Thread( gcnew ThreadStart( MyInterlockedExchangeExampleClass::MyThreadProc ) );
      myThread->Name = String::Format( "Thread {0}", i + 1 );
      
      //Wait a random amount of time before starting next thread.
      Thread::Sleep( rnd->Next( 0, 1000 ) );
      myThread->Start();
   }
}
using System;
using System.Threading;
namespace InterlockedExchange_Example
{
    class MyInterlockedExchangeExampleClass
    {
        //0 for false, 1 for true.
        private static int usingResource = 0;
        private const int numThreadIterations = 5;
        private const int numThreads = 10;
        static void Main()
        {
            Thread myThread;
            Random rnd = new Random();
            for(int i = 0; i < numThreads; i++)
            {
                myThread = new Thread(new ThreadStart(MyThreadProc));
                myThread.Name = String.Format("Thread{0}", i + 1);
            
                //Wait a random amount of time before starting next thread.
                Thread.Sleep(rnd.Next(0, 1000));
                myThread.Start();
            }
        }
        private static void MyThreadProc()
        {
            for(int i = 0; i < numThreadIterations; i++)
            {
                UseResource();
            
                //Wait 1 second before next attempt.
                Thread.Sleep(1000);
            }
        }
        //A simple method that denies reentrancy.
        static bool UseResource()
        {
            //0 indicates that the method is not in use.
            if(0 == Interlocked.Exchange(ref usingResource, 1))
            {
                Console.WriteLine("{0} acquired the lock", Thread.CurrentThread.Name);
            
                //Code to access a resource that is not thread safe would go here.
            
                //Simulate some work
                Thread.Sleep(500);
                Console.WriteLine("{0} exiting lock", Thread.CurrentThread.Name);
            
                //Release the lock
                Interlocked.Exchange(ref usingResource, 0);
                return true;
            }
            else
            {
                Console.WriteLine("   {0} was denied the lock", Thread.CurrentThread.Name);
                return false;
            }
        }
    }
}
Imports System.Threading
Namespace InterlockedExchange_Example
    Class MyInterlockedExchangeExampleClass
        '0 for false, 1 for true.
        Private Shared usingResource As Integer = 0
        Private Const numThreadIterations As Integer = 5
        Private Const numThreads As Integer = 10
        <MTAThread> _
        Shared Sub Main()
            Dim myThread As Thread
            Dim rnd As New Random()
            Dim i As Integer
            For i = 0 To numThreads - 1
                myThread = New Thread(AddressOf MyThreadProc)
                myThread.Name = String.Format("Thread{0}", i + 1)
                'Wait a random amount of time before starting next thread.
                Thread.Sleep(rnd.Next(0, 1000))
                myThread.Start()
            Next i
        End Sub
        Private Shared Sub MyThreadProc()
            Dim i As Integer
            For i = 0 To numThreadIterations - 1
                UseResource()
                'Wait 1 second before next attempt.
                Thread.Sleep(1000)
            Next i
        End Sub 
        'A simple method that denies reentrancy.
        Shared Function UseResource() As Boolean
            '0 indicates that the method is not in use.
            If 0 = Interlocked.Exchange(usingResource, 1) Then
                Console.WriteLine("{0} acquired the lock", Thread.CurrentThread.Name)
                'Code to access a resource that is not thread safe would go here.
                'Simulate some work
                Thread.Sleep(500)
                Console.WriteLine("{0} exiting lock", Thread.CurrentThread.Name)
                'Release the lock
                Interlocked.Exchange(usingResource, 0)
                Return True
            Else
                Console.WriteLine("   {0} was denied the lock", Thread.CurrentThread.Name)
                Return False
            End If
        End Function 
    End Class 
End Namespace
另请参阅
适用于
Exchange(Int16, Int16)
将 16 位无符号整数设置为指定值,并将原始值作为原子操作返回。
public:
 static short Exchange(short % location1, short value);public static short Exchange (ref short location1, short value);static member Exchange : int16 * int16 -> int16Public Shared Function Exchange (ByRef location1 As Short, value As Short) As Short参数
- location1
- Int16
要设置为指定值的变量。
- value
- Int16
设置 location1 参数的值。
返回
              location1的原始值。
例外
location1 的地址是 null 指针。
适用于
Exchange(Double, Double)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
将双精度浮点数设置为指定值,并将原始值作为原子操作返回。
public:
 static double Exchange(double % location1, double value);public static double Exchange (ref double location1, double value);static member Exchange : double * double -> doublePublic Shared Function Exchange (ByRef location1 As Double, value As Double) As Double参数
- location1
- Double
要设置为指定值的变量。
- value
- Double
设置 location1 参数的值。
返回
              location1的原始值。
例外
              location1 的地址是 null 指针。
另请参阅
适用于
Exchange(Object, Object)
- Source:
- Interlocked.cs
- Source:
- Interlocked.cs
- Source:
- Interlocked.CoreCLR.cs
将对象设置为指定的值,并将对原始对象的引用作为原子操作返回。
public:
 static System::Object ^ Exchange(System::Object ^ % location1, System::Object ^ value);public static object Exchange (ref object location1, object value);public static object? Exchange (ref object? location1, object? value);static member Exchange : obj * obj -> objPublic Shared Function Exchange (ByRef location1 As Object, value As Object) As Object参数
- location1
- Object
要设置为指定值的变量。
- value
- Object
设置 location1 参数的值。
返回
              location1的原始值。
例外
              location1 的地址是 null 指针。
              location1 的地址是 null 指针。
注解
重要
从 .NET Framework 2.0 开始,Exchange<T>(T, T) 方法重载为引用类型提供类型安全的替代方法。 建议调用它,而不是此重载。
另请参阅
适用于
Exchange<T>(T, T)
- Source:
- Interlocked.CoreCLR.cs
- Source:
- Interlocked.CoreCLR.cs
- Source:
- Interlocked.CoreCLR.cs
将指定类型的变量 T 设置为指定值,并将原始值作为原子操作返回。
public:
generic <typename T>
 where T : class static T Exchange(T % location1, T value);public static T Exchange<T> (ref T location1, T value) where T : class;[System.Runtime.InteropServices.ComVisible(false)]
public static T Exchange<T> (ref T location1, T value) where T : class;static member Exchange : 'T * 'T -> 'T (requires 'T : null)[<System.Runtime.InteropServices.ComVisible(false)>]
static member Exchange : 'T * 'T -> 'T (requires 'T : null)Public Shared Function Exchange(Of T As Class) (ByRef location1 As T, value As T) As T类型参数
- T
要用于 location1 和 value的类型。 此类型必须是引用类型。
参数
- location1
- T
要设置为指定值的变量。 这是一个引用参数(在 C# 中ref,在 Visual Basic 中 ByRef)。
- value
- T
设置 location1 参数的值。
返回
              location1的原始值。
- 属性
例外
              location1 的地址是 null 指针。
指定了不受支持的 T。
注解
此方法仅支持引用类型。 Int32、Int64、IntPtr、Single和 Double 值类型都有 Exchange 方法的重载,但不支持其他值类型。
注意
此方法重载优于 Exchange(Object, Object) 方法重载,因为后者需要后期绑定访问目标对象。