I am sure that Eric Lippert will come later and give a better answer, but in case this does not happen - here is my trick, because I was also interested in this. The meaning of "d", "c" and similar characters I received from this answer by Eric Lippert.
1) MyProject.ViewModels.SomeViewModel.<OnLogin>d__69.MoveNext()
It is relatively simple. OnLogin is an asynchronous method, and such methods are overwritten by the compiler in the state machine. This state machine implements the IAsyncStateMachine interface, which has a IAsyncStateMachine method. Thus, your async method basically becomes a sequence of MoveNext calls to this state machine. This is why you see MoveNext() in the stack trace.
MyProject.ViewModels.SomeViewModel.<OnLogin>d__69 is the name of the generated state machine class. Since this state machine is associated with the OnLogin method, it becomes part of the type name. d is the "iterator class" from the link above. Please note that the information from the link above is 7 years old and is in front of the async \ await implementation, but I assume that the state machine is like an iterator (same MoveNext method, same principle) - so the iterator class looks fine. 69 is a unique counter number. I think this is just a counter, because if I compile the dll with two asynchronous methods, their state machines will be d__0 and d__1 . It is not possible to deduce that part of the asynchronous method that was selected based on this information.
2) b is an โanonymous methodโ (link above). I did some experiments, and I think that the first index is associated with the method in which the anonymous method was used, and the second index is associated with the index of the anonymous method inside the method in which they are used. For example, suppose you use 2 anonymous methods in a constructor and 2 anonymous methods in a Foo method in the same class. Then:
public Test() { Handler += (s, e) => Foo(); // this will be `b__0_0` because it first in this method Handler += (s, e) => Bar(); // this will be `b__0_1` because it second } static void Foo() { Action a = () => Console.WriteLine("test"); // this is `b__1_0`, 1 refers to it being in another method, not in constructor. // if we use anonymous method in `Bar()` - it will have this index 2 a(); Action b = () => Console.WriteLine("test2"); // this is `b__1_1` b(); }
3) It looks rather complicated. First you ask: "Why is the second parameter (token) not displayed in the signature." This is simple - because the method in question is an anonymous task => task.GetAwaiter().GetResult() method, not your GetWatchedTask method. Now I could not reproduce the stack trace from this, but still some information. First, System.__Canon :
The internal method table used to instantiate the "canonical" method for standard instances. The name "__Canon" will never be visible to users, but it will be displayed a lot in the debugger stack trace using generics, so it is kept intentionally short to avoid troubles.
It looks mysterious to me, but I assume that it represents your T at runtime. Then <>c__3$1<System.__Canon> is <>c__3$1<T> and is the name of the class generated by the compiler, where "c" is the "anonymous method closure class" (from the link above). Such a class is generated by the compiler when creating a closure, so fix some external state in your anonymous method. What was captured must be stored somewhere, and it is stored in that class.
Next, <GetWatchedTask>b__3_0 is the method in the anonymous class above. It represents your method task => task.GetAwaiter().GetResult() . Everything from point 2 also applies here.
I do not know the value of $ , perhaps it represents the number of type parameters. Therefore, perhaps Task$1<System.__Canon> means Task<T> , and something like Tuple$2<System.__Canon will mean Tuple<T1, T2> .
4) What I, unfortunately, do not know and could not reproduce.
5) c__DisplayClass142_3 again the closure class (see clause 3). <LoadGroups>b__3() is the anonymous method that you used in the LoadGroups method. Thus, this points to some anonymous method, which is a closure (captured external state) and which is called in the LoadGroups method.