mirror of
https://gitee.com/csharpui/CPF.git
synced 2025-07-15 23:13:33 +08:00
72 lines
1.6 KiB
C#
72 lines
1.6 KiB
C#
![]() |
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);
|
||
|
}
|
||
|
}
|