Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

ReaderWriterLockSlim (Clase)

Representa un bloqueo que se utiliza para administrar el acceso a un recurso y que permite varios subprocesos para la lectura o acceso exclusivo para la escritura.

System.Object
  System.Threading.ReaderWriterLockSlim

Espacio de nombres:  System.Threading
Ensamblado:  System.Core (en System.Core.dll)

[HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public class ReaderWriterLockSlim : IDisposable

El tipo ReaderWriterLockSlim expone los siguientes miembros.

  NombreDescripción
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsReaderWriterLockSlim()Inicializa una nueva instancia de la clase ReaderWriterLockSlim con los valores de propiedad predeterminados.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsReaderWriterLockSlim(LockRecursionPolicy)Inicializa una nueva instancia de la clase ReaderWriterLockSlim especificando la directiva de recursividad de bloqueo.
Arriba

  NombreDescripción
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsCurrentReadCountObtiene el número total de subprocesos únicos que han entrado en el bloqueo en modo de lectura.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsIsReadLockHeldObtiene un valor que indica si el subproceso actual ha entrado en el bloqueo en modo de lectura.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsIsUpgradeableReadLockHeldObtiene un valor que indica si el subproceso actual ha entrado en el bloqueo en modo de actualización.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsIsWriteLockHeldObtiene un valor que indica si el subproceso actual ha entrado en el bloqueo en modo de escritura.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsRecursionPolicyObtiene un valor que indica la directiva de recursividad del objeto ReaderWriterLockSlim actual.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsRecursiveReadCountObtiene el número de veces que el subproceso actual ha entrado en el bloqueo en modo de lectura, como una indicación de recursividad.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsRecursiveUpgradeCountObtiene el número de veces que el subproceso actual ha entrado en el bloqueo en modo de actualización, como una indicación de recursividad.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsRecursiveWriteCountObtiene el número de veces que el subproceso actual ha entrado en el bloqueo en modo de escritura, como una indicación de recursividad.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsWaitingReadCountObtiene el número total de subprocesos que están a la espera de entrar en el bloqueo en modo de lectura.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsWaitingUpgradeCountObtiene el número total de subprocesos que están a la espera de entrar en el bloqueo en modo de actualización.
Propiedad públicaCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsWaitingWriteCountObtiene el número total de subprocesos que están a la espera de entrar en el bloqueo en modo de escritura.
Arriba

  NombreDescripción
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsDisposeLibera todos los recursos usados por la instancia actual de la clase ReaderWriterLockSlim.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsEnterReadLockIntenta entrar en el bloqueo en modo de lectura.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsEnterUpgradeableReadLockIntenta entrar en el bloqueo en modo de actualización.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsEnterWriteLockIntenta entrar en el bloqueo en modo de escritura.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsEquals(Object)Determina si el objeto especificado es igual al objeto actual. (Se hereda de Object).
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsExitReadLockReduce el recuento de recursividad para el modo de lectura y sale del modo de lectura si el recuento resultante es 0 (cero).
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsExitUpgradeableReadLockReduce el recuento de recursividad para el modo de actualización y sale del modo de actualización si el recuento resultante es 0 (cero).
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsExitWriteLockReduce el recuento de recursividad para el modo de escritura y sale del modo de escritura si el recuento resultante es 0 (cero).
Método protegidoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsFinalize Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por la recolección de elementos no utilizados. (Se hereda de Object).
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsGetHashCode Sirve como una función hash para un tipo en particular. (Se hereda de Object).
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsGetType Obtiene el Type de la instancia actual. (Se hereda de Object).
Método protegidoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsMemberwiseClone Crea una copia superficial del Object actual. (Se hereda de Object).
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsToString Retorna una cadena que representa al objeto actual. (Se hereda de Object).
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsTryEnterReadLock(Int32)Intenta entrar en el bloqueo en modo de lectura, con un tiempo de espera entero opcional.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsTryEnterReadLock(TimeSpan)Intenta entrar en el bloqueo en modo de lectura, con tiempo de espera opcional.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsTryEnterUpgradeableReadLock(Int32)Intenta entrar en el bloqueo en modo de actualización, con tiempo de espera opcional.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsTryEnterUpgradeableReadLock(TimeSpan)Intenta entrar en el bloqueo en modo de actualización, con tiempo de espera opcional.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsTryEnterWriteLock(Int32)Intenta entrar en el bloqueo en modo de escritura, con tiempo de espera opcional.
Método públicoCompatible con Biblioteca de clases portableCompatible con .NET para aplicaciones de la Tienda WindowsTryEnterWriteLock(TimeSpan)Intenta entrar en el bloqueo en modo de escritura, con tiempo de espera opcional.
Arriba

Utilice ReaderWriterLockSlim para proteger un recurso que leen varios subprocesos y en el que escribe un solo subproceso a la vez. ReaderWriterLockSlim permite que varios subprocesos estén en modo de lectura, permite que un subproceso esté en modo de escritura con propiedad exclusiva del bloqueo y permite que un subproceso que tiene acceso de lectura esté en modo de lectura actualizable, modo desde el cual puede actualizarse a modo de escritura sin tener que abandonar su acceso de lectura al recurso.

NotaNota

ReaderWriterLockSlim es similar a ReaderWriterLock, pero tiene reglas simplificadas para la recursividad y para actualizar y degradar el estado del bloqueo. ReaderWriterLockSlim evita muchos casos de interbloqueo potencial. Además, el rendimiento de ReaderWriterLockSlim es significativamente mejor que ReaderWriterLock. ReaderWriterLockSlim se recomienda para todos los trabajos de desarrollo nuevos.

De forma predeterminada, las nuevas instancias de ReaderWriterLockSlim se crean con el marcador LockRecursionPolicy.NoRecursion y no permiten la recursividad. Esta directiva predeterminada se recomienda para todos los trabajos de desarrollo nuevos, porque la recursividad presenta complicaciones innecesarias y hace que el código sea más susceptible a los interbloqueos. Para simplificar la migración de los proyectos existentes que utilizan Monitor o ReaderWriterLock, puede usar el marcador LockRecursionPolicy.SupportsRecursion para crear instancias de ReaderWriterLockSlim que permitan la recursividad.

Un subproceso puede entrar en el bloqueo en tres modos: modo de lectura, modo de escritura y modo de lectura actualizable (en el resto de este tema, "modo de lectura actualizable" se denomina "modo de actualización" y se prefiere la frase "entrar en modo de x" a "entrar en el bloqueo en modo de x, que es más larga).

Independientemente de la directiva de recursividad, sólo puede haber un subproceso en modo de escritura en un momento dado. Cuando un subproceso está en modo de escritura, ningún otro subproceso puede entrar en el bloqueo, en ningún modo. Sólo puede haber un subproceso en modo de actualización en un momento dado. Puede haber un número ilimitado de subprocesos en modo de lectura, y puede haber un subproceso en modo de actualización mientras otros están en modo de lectura.

ReaderWriterLockSlim es afín a los subprocesos administrados; es decir, cada objeto Thread debe realizar sus propias llamadas al método para entrar en los modos de bloqueo y salir de ellos. Ningún subproceso puede cambiar el modo de otro subproceso.

Si ReaderWriterLockSlim no permite la recursividad, un subproceso que intenta entrar en el bloqueo se puede bloquear por varias razones:

  • Un subproceso que intenta entrar en modo de lectura se bloquea si hay subprocesos a la espera de entrar en modo de escritura o si hay un solo subproceso en modo de escritura.

    NotaNota

    El bloqueo de nuevos lectores cuando hay escritores en la cola es una directiva de equidad de bloqueo que favorece a los escritores. La directiva de equidad actual equilibra la equidad para lectores y escritores, con el fin de mejorar el rendimiento en los escenarios más comunes. En futuras versiones de .NET Framework quizás se incluyan nuevas directivas de equidad.

  • Un subproceso que intenta entrar en modo de actualización se bloquea si ya es un subproceso en modo de actualización, si hay subprocesos a la espera de entrar en modo de escritura o si hay un solo subproceso en modo de escritura.

  • Un subproceso que intenta entrar en modo de escritura se bloquea si hay un subproceso en cualquiera de los tres modos.

Actualizar y degradar bloqueos

El modo de actualización está pensado para los casos en los que un subproceso normalmente lee el recurso protegido, pero podría necesitar escribir en él si se cumple alguna condición. Un subproceso que ha entrado en ReaderWriterLockSlim en modo de actualización tiene acceso de lectura al recurso protegido y puede actualizarse al modo de escritura mediante una llamada al método EnterWriteLock o TryEnterWriteLock. Dado que no puede haber más de un subproceso en modo de actualización a la vez, la actualización al modo de escritura no puede producir un interbloqueo cuando no se permite la recursividad, que es la directiva predeterminada.

Nota importanteImportante

Con independencia de la directiva de recursividad, un subproceso que entró inicialmente en modo de lectura no puede actualizarse a modo de actualización o a modo de escritura, porque ese modelo genera una probabilidad grande de interbloqueos. Por ejemplo, si dos subprocesos que se encuentran en modo de lectura intentan entrar en modo de escritura, se interbloquean. El modo de actualización está diseñado para evitar estos interbloqueos.

Si hay otros subprocesos en modo de lectura, el subproceso que se está actualizando se bloquea. Mientras se bloquea el subproceso, se bloquearán otros subprocesos que intenten entrar en modo de lectura. Cuando todos los subprocesos han salido del modo de lectura, el subproceso actualizable bloqueado entra en modo de escritura. Si hay otros subprocesos a la espera de entrar en modo de escritura, siguen bloqueados, porque el subproceso que está en modo de actualización evita que obtengan acceso exclusivo al recurso.

Cuando el subproceso en modo de actualización sale del modo de escritura, pueden entrar en modo de lectura otros subprocesos que estén a la espera de tal acción, a menos que haya subprocesos a la espera de entrar en modo de escritura. El subproceso en modo de actualización puede actualizarse y degradarse indefinidamente, siempre y cuando sea el único subproceso que escribe en el recurso protegido.

Nota importanteImportante

Si permite que varios subprocesos entren en modo de escritura o en modo de actualización, no debe permitir que un subproceso monopolice el modo de actualización. De lo contrario, los subprocesos que intenten entrar directamente en modo de escritura se bloquearán indefinidamente y, mientras estén bloqueados, otros subprocesos no podrán entrar en modo de lectura.

Un subproceso en modo de actualización puede degradarse a modo de lectura llamando primero al método EnterReadLock y después al método ExitUpgradeableReadLock. Este modelo de degradación se permite para todas las directivas de recursividad de bloqueo, incluso NoRecursion.

Después de degradarse a modo de lectura, un subproceso no puede volver a entrar en modo de actualización hasta que haya salido del modo de lectura.

Entrar en el bloqueo de forma recursiva

Puede crear un ReaderWriterLockSlim que admita la entrada recursiva en el bloqueo utilizando el constructor ReaderWriterLockSlim(LockRecursionPolicy) que especifica la directiva de bloqueo y especificando LockRecursionPolicy.SupportsRecursion.

NotaNota

El uso de la recursividad no se recomienda para los trabajos de desarrollo nuevos, porque presenta complicaciones innecesarias y hace que el código sea más susceptible a los interbloqueos.

Para un objeto ReaderWriterLockSlim que permite la recursividad se puede comentar lo siguiente acerca de los modos en los que puede entrar un subproceso:

  • Un subproceso en modo de lectura puede entrar en modo de lectura de forma recursiva, pero no puede entrar en modo de escritura ni en modo de actualización. Si lo intenta, se inicia LockRecursionException. Entrar en modo de lectura y después en modo de escritura o actualización es un modelo con muchas probabilidades de interbloqueos, por lo que no se permite. Como se ha mencionado anteriormente, el modo de actualización se proporciona para los casos en que es necesario actualizar un bloqueo.

  • Un subproceso en modo de actualización puede entrar en modo de escritura y/o modo de lectura y puede entrar de forma recursiva en cualquiera de los tres modos. Sin embargo, al intentar entrar en modo de escritura, se produce un bloqueo si hay otros subprocesos en modo de lectura.

  • Un subproceso en modo de escritura puede entrar en modo de lectura y/o en modo de actualización y puede entrar de forma recursiva en cualquiera de los tres modos.

  • Un subproceso que no ha entrado en el bloqueo puede entrar en cualquier modo. Este intento puede producir un bloqueo por las mismas razones que un intento de entrar en un bloqueo no recursivo.

Un subproceso puede salir de los modos en los que ha entrado en cualquier orden, siempre que salga de cada modo exactamente el mismo número de veces que ha entrado. Si un subproceso intenta salir de un modo demasiadas veces o salir de un modo en el que no ha entrado, se inicia SynchronizationLockException.

Estados de bloqueo

Puede que le resulte útil considerar el bloqueo en términos de sus estados. Un ReaderWriterLockSlim puede estar en uno de cuatro estados: no entrado, lectura, actualización y escritura.

  • No entrado: en este estado, ningún subproceso ha entrado en el bloqueo (o todos los subprocesos han salido del mismo).

  • Lectura: en este estado, uno o más subprocesos han entrado en el bloqueo para tener acceso de lectura al recurso protegido.

    NotaNota

    Un subproceso puede entrar en el bloqueo en modo de lectura a través del método EnterReadLock o TryEnterReadLock o degradándose desde el modo de actualización.

  • Actualización: en este estado, un subproceso ha entrado en el bloqueo para tener acceso de lectura con la opción de actualizarse a acceso de escritura (es decir, en modo de actualización) y cero o más subprocesos han entrado en el bloqueo para tener acceso de lectura. Sólo un subproceso puede entrar en el bloqueo con la opción de actualización; los demás bloqueos que intenten entrar en modo de actualización se bloquean.

  • Escritura: en este estado, un subproceso ha entrado en el bloqueo para tener acceso de escritura al recurso protegido. Ese subproceso tiene posesión exclusiva del bloqueo. Los demás subprocesos que intenten entrar en el bloqueo por cualquier razón se bloquearán.

En la tabla siguiente se describen las transiciones entre los estados de bloqueo, para los bloqueos que no permiten la recursividad, cuando un subproceso t realiza la acción descrita en la columna situada en el extremo izquierdo. Cuando realiza la acción, t no tiene ningún modo (cuando t está en modo de actualización, se describe en las notas al pie de la tabla, ya que es un caso especial). La fila superior describe el estado inicial del bloqueo. Las celdas describen lo que le sucede al subproceso y muestran los cambios del estado de bloqueo entre paréntesis.

No entrado (N)

Lectura (L)

Actualización (A)

Escritura (E)

t entra en modo de lectura

t entra en (L).

t se bloquea si hay subprocesos a la espera del modo de escritura; de lo contrario, t entra.

t se bloquea si hay subprocesos a la espera del modo de escritura; de lo contrario, t entra.1

t se bloquea.

t entra en modo de actualización

t entra en (A).

t se bloquea si hay subprocesos a la espera del modo de escritura o de actualización; de lo contrario, t entra en (A).

t se bloquea.

t se bloquea.

t entra en modo de escritura

t entra en (E).

t se bloquea.

t se bloquea.2

t se bloquea.

1 Si t empieza en modo de actualización, entra en modo de lectura. Esta acción nunca se bloquea. El estado del bloqueo no cambia (después, el subproceso puede completar una degradación a modo de lectura saliendo del modo de actualización).

2 Si t empieza en modo de actualización, se bloquea si hay subprocesos en modo de lectura. De lo contrario, se actualiza a modo de escritura. El estado del bloqueo cambia a Escritura (E). Si t se bloquea porque hay subprocesos en modo de lectura, entra en modo de escritura en cuanto el último subproceso salga del modo de lectura, aun cuando haya subprocesos que estén a la espera de entrar en modo de escritura.

Cuando se produce un cambio de estado porque un subproceso sale del bloqueo, el siguiente subproceso que debe activarse se selecciona de esta manera:

  • Primero, un subproceso que esté a la espera del modo de escritura y ya se encuentre en modo de actualización (puede haber como máximo un subproceso de este tipo).

  • Si no es posible, un subproceso que esté a la espera del modo de escritura.

  • Si no es posible, un subproceso que esté a la espera del modo de actualización.

  • Si no es posible, todos los subprocesos que estén a la espera del modo de lectura.

El estado posterior del bloqueo siempre es Escritura (E) en los dos primeros casos y Actualización (A) en el tercero, independientemente del estado del bloqueo cuando el subproceso que sale activa el cambio de estado. En el último caso, el estado del bloqueo es Actualización (A) si hay un subproceso en modo de actualización después del cambio de estado y Lectura (L) en los demás casos, con independencia del estado anterior.

NotaNota

El atributo HostProtectionAttribute aplicado a este tipo o miembro tiene el valor de propiedad Resources siguiente: MayLeakOnAbort | Synchronization | ExternalThreading. El atributo HostProtectionAttribute no afecta a las aplicaciones de escritorio (que normalmente se inician haciendo doble clic en un icono, escribiendo un comando o introduciendo una dirección URL en el explorador). Para obtener más información, vea la clase HostProtectionAttribute o Programación en SQL Server y atributos de protección de host.

En el ejemplo siguiente se muestra una memoria caché sincronizada simple que contiene cadenas con claves de enteros. Se usa una instancia de ReaderWriterLockSlim para sincronizar el acceso al Dictionary<TKey, TValue> que actúa como caché interna.

En el ejemplo se incluyen métodos simples para agregar, eliminar y leer información en la caché. Para mostrar los tiempos de espera, el ejemplo incluye un método que sólo agrega información a la caché si puede hacerlo dentro de un tiempo de espera especificado.

Para mostrar el modo de actualización, el ejemplo incluye un método que recupera el valor asociado a una clave y lo compara con un nuevo valor. Si el valor no cambia, el método devuelve un estado que indica que no hay cambios. Si no se encuentran valores para la clave, se inserta el par de clave y valor. Si ha cambiado el valor, se actualiza. El modo de actualización permite al subproceso actualizarse del acceso de lectura al acceso de escritura según sea necesario sin el riesgo de interbloqueos.

El ejemplo incluye una enumeración anidada que especifica los valores devueltos para el método que muestra el modo de actualización.

En el ejemplo, se usa el constructor predeterminado para crear el bloqueo; por tanto, no se permite la recursividad. Programar el objeto ReaderWriterLockSlim es más sencillo y menos propenso a errores cuando el bloqueo no permite la recursividad.


using System;
using System.Threading;
using System.Collections.Generic;

public class SynchronizedCache
{
    private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
    private Dictionary<int, string> innerCache = new Dictionary<int, string>();

    public string Read(int key)
    {
        cacheLock.EnterReadLock();
        try
        {
            return innerCache[key];
        }
        finally
        {
            cacheLock.ExitReadLock();
        }
    }

    public void Add(int key, string value)
    {
        cacheLock.EnterWriteLock();
        try
        {
            innerCache.Add(key, value);
        }
        finally
        {
            cacheLock.ExitWriteLock();
        }
    }

    public bool AddWithTimeout(int key, string value, int timeout)
    {
        if (cacheLock.TryEnterWriteLock(timeout))
        {
            try
            {
                innerCache.Add(key, value);
            }
            finally
            {
                cacheLock.ExitWriteLock();
            }
            return true;
        }
        else
        {
            return false;
        }
    }

    public AddOrUpdateStatus AddOrUpdate(int key, string value)
    {
        cacheLock.EnterUpgradeableReadLock();
        try
        {
            string result = null;
            if (innerCache.TryGetValue(key, out result))
            {
                if (result == value)
                {
                    return AddOrUpdateStatus.Unchanged;
                }
                else
                {
                    cacheLock.EnterWriteLock();
                    try
                    {
                        innerCache[key] = value;
                    }
                    finally
                    {
                        cacheLock.ExitWriteLock();
                    }
                    return AddOrUpdateStatus.Updated;
                }
            }
            else
            {
                cacheLock.EnterWriteLock();
                try
                {
                    innerCache.Add(key, value);
                }
                finally
                {
                    cacheLock.ExitWriteLock();
                }
                return AddOrUpdateStatus.Added;
            }
        }
        finally
        {
            cacheLock.ExitUpgradeableReadLock();
        }
    }

    public void Delete(int key)
    {
        cacheLock.EnterWriteLock();
        try
        {
            innerCache.Remove(key);
        }
        finally
        {
            cacheLock.ExitWriteLock();
        }
    }

    public enum AddOrUpdateStatus
    {
        Added,
        Updated,
        Unchanged
    };
}


.NET Framework

Compatible con: 4.5, 4, 3.5

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Biblioteca de clases portable

Compatible con: Biblioteca de clases portable

.NET para aplicaciones de la Tienda Windows

Compatible con: Windows 8

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Este tipo es seguro para la ejecución de subprocesos.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft