using System.Threading.Tasks;
public static async Task Main()
var cam = new AsyncCamera(new Camera());
Console.WriteLine("Capture");
_ = await cam.CaptureAsync();
Console.WriteLine("Back");
Console.WriteLine("SubscriberCount: {0}", cam.GetSubscriberCount());
public class ReadResult{}
public class ControllerProxy{}
public void RequestCapture(){
System.Threading.Thread.Sleep(1000);
var handler = OnReadResult;
handler?.Invoke(null, new ReadResult());
public delegate void ReadResultEventHandler(ControllerProxy sender, ReadResult readResult);
public event ReadResultEventHandler OnReadResult;
public int GetSubscriberCount()
var invocList = OnReadResult?.GetInvocationList();
return (invocList is null) ? 0 : invocList.Length;
private readonly Camera camera;
public AsyncCamera(Camera camera)
this.camera = camera ?? throw new ArgumentNullException(nameof(camera));
public Task<ReadResult> CaptureAsync()
Camera.ReadResultEventHandler handler = null;
TaskCompletionSource<ReadResult> tcs = new TaskCompletionSource<ReadResult>();
handler = (sender, result) => {
camera.OnReadResult -= handler;
tcs.TrySetResult(result);
camera.OnReadResult += handler;
public int GetSubscriberCount()
return camera.GetSubscriberCount();