Exemplo n.º 1
0
        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]);
        }