public static Member <object> GetCurrentAwaiter(this IAsyncStateMachine sm) { var candidateAwaiters = new List <Member <object> >(); var fieldInfos = sm.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); foreach (var fieldInfo in fieldInfos) { if (!fieldInfo.Name.StartsWith("<>u__")) { continue; } var awaiter = fieldInfo.GetValue(sm); if (awaiter == null) { continue; } // typical awaiters have a field named "m_task" of type Task var taskFieldInfo = awaiter.GetType().GetField("m_task", BindingFlags.NonPublic | BindingFlags.Instance); if (taskFieldInfo != null && typeof(Task).IsAssignableFrom(taskFieldInfo.FieldType)) { var m_task = taskFieldInfo.GetValue(awaiter); if (m_task == null) { continue; } } candidateAwaiters.Add(CreateMember(fieldInfo.Name, awaiter)); } if (candidateAwaiters.Count != 1) { throw new NotSupportedException($"Async method {sm.Name()} has awaiters that are too complicated to process"); } return(candidateAwaiters[0]); }