CPF/CPF.Mac/Mac/CoreFoundation/DispatchGroup.cs

72 lines
1.6 KiB
C#
Raw Normal View History

2023-11-21 23:05:03 +08:00
using CPF.Mac.Foundation;
using System;
using System.Runtime.InteropServices;
namespace CPF.Mac.CoreFoundation
{
public class DispatchGroup : DispatchObject
{
private DispatchGroup(IntPtr handle, bool owns)
: base(handle, owns)
{
}
public static DispatchGroup Create()
{
IntPtr intPtr = dispatch_group_create();
if (intPtr == IntPtr.Zero)
{
return null;
}
return new DispatchGroup(intPtr, owns: true);
}
public void DispatchAsync(DispatchQueue queue, NSAction action)
{
if (queue == null)
{
throw new ArgumentNullException("queue");
}
if (action == null)
{
throw new ArgumentNullException("action");
}
Check();
dispatch_group_async_f(handle, queue.handle, (IntPtr)GCHandle.Alloc(Tuple.Create(action, queue)), DispatchQueue.static_dispatch);
}
public void Enter()
{
Check();
dispatch_group_enter(handle);
}
public void Leave()
{
Check();
dispatch_group_leave(handle);
}
public bool Wait(DispatchTime timeout)
{
Check();
return dispatch_group_wait(handle, timeout.Nanoseconds) == IntPtr.Zero;
}
[DllImport("libc")]
private static extern IntPtr dispatch_group_create();
[DllImport("libc")]
private static extern void dispatch_group_async_f(IntPtr group, IntPtr queue, IntPtr context, DispatchQueue.dispatch_callback_t block);
[DllImport("libc")]
private static extern void dispatch_group_enter(IntPtr group);
[DllImport("libc")]
private static extern void dispatch_group_leave(IntPtr group);
[DllImport("libc")]
private static extern IntPtr dispatch_group_wait(IntPtr group, ulong timeout);
}
}