SafeWaitHandle 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
代表等待句柄的包裝類別。
public ref class SafeWaitHandle sealed : System::Runtime::InteropServices::SafeHandle
public ref class SafeWaitHandle sealed : Microsoft::Win32::SafeHandles::SafeHandleZeroOrMinusOneIsInvalid
[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
[<System.Security.SecurityCritical>]
type SafeWaitHandle = class
inherit SafeHandle
type SafeWaitHandle = class
inherit SafeHandleZeroOrMinusOneIsInvalid
[<System.Security.SecurityCritical>]
type SafeWaitHandle = class
inherit SafeHandleZeroOrMinusOneIsInvalid
Public NotInheritable Class SafeWaitHandle
Inherits SafeHandle
Public NotInheritable Class SafeWaitHandle
Inherits SafeHandleZeroOrMinusOneIsInvalid
- 繼承
- 繼承
- 屬性
範例
以下程式碼範例示範如何利用 interop 來利用 SafeWaitHandle 類別與非管理 CreateMutex 函式建立互斥體。
using System;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
class SafeHandlesExample
{
static void Main()
{
UnmanagedMutex uMutex = new("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.");
}
}
}
partial class UnmanagedMutex(string Name)
{
// Use interop to call the CreateMutex function.
[LibraryImport("kernel32.dll", EntryPoint = "CreateMutexW", StringMarshalling = StringMarshalling.Utf16)]
private static partial SafeWaitHandle CreateMutex(
IntPtr lpMutexAttributes,
[MarshalAs(UnmanagedType.Bool)] bool bInitialOwner,
string lpName
);
// Use interop to call the ReleaseMutex function.
// For more information about ReleaseMutex,
// see the unmanaged MSDN reference library.
[LibraryImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static partial bool ReleaseMutex(SafeWaitHandle hMutex);
private SafeWaitHandle _handleValue = null;
private readonly IntPtr _mutexAttrValue = IntPtr.Zero;
private string nameValue = Name;
public void Create()
{
ArgumentException.ThrowIfNullOrEmpty(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 (!_handleValue.IsInvalid)
{
return _handleValue;
}
else
{
return null;
}
}
}
public string Name => nameValue;
public void Release()
{
ReleaseMutex(_handleValue);
}
}
Imports Microsoft.Win32.SafeHandles
Imports System.Runtime.InteropServices
Class SafeHandlesExample
Shared Sub Main()
Dim uMutex As New UnmanagedMutex("YourCompanyName_SafeHandlesExample_MUTEX")
Try
uMutex.Create()
Console.WriteLine("Mutex created. Press Enter to release it.")
Console.ReadLine()
Catch e As Exception
Console.WriteLine(e)
Finally
uMutex.Release()
Console.WriteLine("Mutex Released.")
End Try
Console.ReadLine()
End Sub
End Class
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)> _
Shared Function CreateMutex(ByVal lpMutexAttributes As IntPtr, ByVal bInitialOwner As Boolean, ByVal lpName As String) As SafeWaitHandle
End Function
' Use interop to call the ReleaseMutex function.
' For more information about ReleaseMutex,
' see the unmanaged MSDN reference library.
<DllImport("kernel32.dll")> _
Public Shared Function ReleaseMutex(ByVal hMutex As SafeWaitHandle) As Boolean
End Function
Private handleValue As SafeWaitHandle = Nothing
Private mutexAttrValue As IntPtr = IntPtr.Zero
Private nameValue As String = Nothing
Public Sub New(ByVal Name As String)
nameValue = Name
End Sub
Public Sub Create()
If nameValue Is Nothing AndAlso nameValue.Length = 0 Then
Throw New ArgumentNullException("nameValue")
End If
handleValue = CreateMutex(mutexAttrValue, True, nameValue)
' If the handle is invalid,
' get the last Win32 error
' and throw a Win32Exception.
If handleValue.IsInvalid Then
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error())
End If
End Sub
Public ReadOnly Property Handle() As SafeWaitHandle
Get
' If the handle is valid,
' return it.
If Not handleValue.IsInvalid Then
Return handleValue
Else
Return Nothing
End If
End Get
End Property
Public ReadOnly Property Name() As String
Get
Return nameValue
End Get
End Property
Public Sub Release()
ReleaseMutex(handleValue)
End Sub
End Class
備註
SafeWaitHandle該類別由該類別使用System.Threading.WaitHandle。 它是 Win32 互斥組織以及自動和手動重置事件的封裝器。
Important
此類型會實作 IDisposable 介面。 當您完成使用這個物品後,應直接或間接地處理它。 若要直接處置類型,請在 Disposetry/ 區塊中呼叫其 catch 方法。 若要間接處置它,請使用語言建構,例如 using (C#) 或 Using (在 Visual Basic 中)。
建構函式
| 名稱 | Description |
|---|---|
| SafeWaitHandle() |
建立 SafeWaitHandle。 |
| SafeWaitHandle(IntPtr, Boolean) |
初始化 SafeWaitHandle 類別的新執行個體。 |
欄位
| 名稱 | Description |
|---|---|
| handle |
指定要包裹的把手。 (繼承來源 SafeHandle) |
屬性
| 名稱 | Description |
|---|---|
| IsClosed |
會得到一個值,表示把柄是否已關閉。 (繼承來源 SafeHandle) |
| IsInvalid |
會得到一個值,表示該句柄是否無效。 |
| IsInvalid |
會得到一個值,表示該句柄是否無效。 (繼承來源 SafeHandleZeroOrMinusOneIsInvalid) |
方法
| 名稱 | Description |
|---|---|
| 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() |
當在衍生類別中覆寫時,會執行釋放 handle 所需的程式碼。 (繼承來源 SafeHandle) |
| SetHandle(IntPtr) |
將 handle 設為指定的既存 handle。 (繼承來源 SafeHandle) |
| SetHandleAsInvalid() |
標記一個不再使用的把手。 (繼承來源 SafeHandle) |
| ToString() |
傳回表示目前 物件的字串。 (繼承來源 Object) |