Прочитать на английском

Поделиться через


SafeWaitHandle Класс

Определение

Представляет класс-оболочку для дескриптора ожидания.

[System.Security.SecurityCritical]
public sealed class SafeWaitHandle : System.Runtime.InteropServices.SafeHandle
public sealed class SafeWaitHandle : Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid
[System.Security.SecurityCritical]
public sealed class SafeWaitHandle : Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid
Наследование
SafeWaitHandle
Наследование
Атрибуты

Примеры

В следующем примере кода показано, как использовать взаимодействие для создания мьютекса SafeWaitHandle с помощью класса и неуправляемой CreateMutex функции.

using System;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;

class SafeHandlesExample
{

    static void Main()
    {
        UnmanagedMutex uMutex = new UnmanagedMutex("YourCompanyName_SafeHandlesExample_MUTEX");

        try
        {

            uMutex.Create();
            Console.WriteLine("Mutex created. Press Enter to release it.");
            Console.ReadLine();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            uMutex.Release();
            Console.WriteLine("Mutex Released.");
        }

        Console.ReadLine();
    }
}

class UnmanagedMutex
{

    // Use interop to call the CreateMutex function.
    // For more information about CreateMutex,
    // see the unmanaged MSDN reference library.
    [DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
    static extern SafeWaitHandle CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner,
    string lpName);

    // Use interop to call the ReleaseMutex function.
    // For more information about ReleaseMutex,
    // see the unmanaged MSDN reference library.
    [DllImport("kernel32.dll")]
    public static extern bool ReleaseMutex(SafeWaitHandle hMutex);

    private SafeWaitHandle handleValue = null;
    private IntPtr mutexAttrValue = IntPtr.Zero;
    private string nameValue = null;

    public UnmanagedMutex(string Name)
    {
        nameValue = Name;
    }

    public void Create()
    {
        if (nameValue == null && nameValue.Length == 0)
        {
            throw new ArgumentNullException("nameValue");
        }

        handleValue = CreateMutex(mutexAttrValue,
                                        true, nameValue);

        // If the handle is invalid,
        // get the last Win32 error
        // and throw a Win32Exception.
        if (handleValue.IsInvalid)
        {
            Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
        }
    }

    public SafeWaitHandle Handle
    {
        get
        {
            // If the handle is valid,
            // return it.
            if (!handleValue.IsInvalid)
            {
                return handleValue;
            }
            else
            {
                return null;
            }
        }
    }

    public string Name
    {
        get
        {
            return nameValue;
        }
    }

    public void Release()
    {
        ReleaseMutex(handleValue);
    }
}

Комментарии

Класс SafeWaitHandle используется классом System.Threading.WaitHandle . Это оболочка для мьютексов Win32 и событий автоматического и ручного сброса.

Важно!

Этот тип реализует интерфейс IDisposable. По окончании использования выдаленную ему память следует прямо или косвенно освободить. Чтобы сделать это прямо, вызовите его метод Dispose в блоке try/catch. Чтобы сделать это косвенно, используйте языковые конструкции, такие как using (в C#) или Using (в Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" в статье об интерфейсе IDisposable.

Конструкторы

SafeWaitHandle()

Создает объект SafeWaitHandle.

SafeWaitHandle(IntPtr, Boolean)

Инициализирует новый экземпляр класса SafeWaitHandle.

Поля

handle

Определяет инкапсулируемый дескриптор.

(Унаследовано от SafeHandle)

Свойства

IsClosed

Возвращает значение, показывающее, является ли дескриптор закрытым.

(Унаследовано от SafeHandle)
IsInvalid

Получает значение, указывающее, является ли дескриптор недействительным.

IsInvalid

Получает значение, указывающее, является ли дескриптор недействительным.

(Унаследовано от SafeHandleZeroOrMinusOneIsInvalid)

Методы

Close()

Помечает дескриптор для освобождения самого дескриптора и соответствующих ресурсов.

(Унаследовано от SafeHandle)
DangerousAddRef(Boolean)

Вручную увеличивает счетчик ссылок для экземпляров SafeHandle.

(Унаследовано от SafeHandle)
DangerousGetHandle()

Возвращает значение поля handle.

(Унаследовано от SafeHandle)
DangerousRelease()

Вручную уменьшает счетчик ссылок для экземпляра SafeHandle.

(Унаследовано от SafeHandle)
Dispose()

Освобождает все ресурсы, используемые классом SafeHandle.

(Унаследовано от SafeHandle)
Dispose(Boolean)

Освобождает неуправляемые ресурсы, используемые классом SafeHandle, определяя, нужно ли выполнять обычную операцию удаления.

(Унаследовано от SafeHandle)
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ReleaseHandle()

При переопределении в производном классе выполняет код, необходимый для освобождения дескриптора.

(Унаследовано от SafeHandle)
SetHandle(IntPtr)

Определяет дескриптор для заданного ранее существующего дескриптора.

(Унаследовано от SafeHandle)
SetHandleAsInvalid()

Помечает дескриптор как больше не используемый.

(Унаследовано от SafeHandle)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

См. также раздел