如何获取异步方法的 $returnValue?

mil*_*lie 6 c# asynchronous visual-studio async-await

我相信每当您在调试时单步执行某个函数时,都可以在 VisualStudio 监视窗口中使用$returnValue,然后它将显示从最后一个方法返回的值。然而,这似乎只适用于非异步方法。如果我尝试在等待的异步方法调用上执行此操作,则它不会被填充。

有没有一种机制可以通过异步调用来做到这一点?

Pau*_*ado 4

异步方法不是您常用的方法。它们是状态机。

这个方法:

async Task Delay() => await Task.Delay(1000);
Run Code Online (Sandbox Code Playgroud)

将被翻译成类似这样的内容:

[CompilerGenerated]
private sealed class <Delay>d__0 : IAsyncStateMachine
{
    public int <>1__state;

    public AsyncTaskMethodBuilder <>t__builder;

    public C <>4__this;

    private TaskAwaiter <>u__1;

    private void MoveNext()
    {
        int num = <>1__state;
        try
        {
            TaskAwaiter awaiter;
            if (num != 0)
            {
                awaiter = Task.Delay(1000).GetAwaiter();
                if (!awaiter.IsCompleted)
                {
                    num = (<>1__state = 0);
                    <>u__1 = awaiter;
                    <Delay>d__0 stateMachine = this;
                    <>t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine);
                    return;
                }
            }
            else
            {
                awaiter = <>u__1;
                <>u__1 = default(TaskAwaiter);
                num = (<>1__state = -1);
            }
            awaiter.GetResult();
        }
        catch (Exception exception)
        {
            <>1__state = -2;
            <>t__builder.SetException(exception);
            return;
        }
        <>1__state = -2;
        <>t__builder.SetResult();
    }

    [DebuggerHidden]
    private void SetStateMachine([System.Runtime.CompilerServices.Nullable(1)] IAsyncStateMachine stateMachine)
    {
    }

[System.Runtime.CompilerServices.NullableContext(1)]
[AsyncStateMachine(typeof(<Delay>d__0))]
[DebuggerStepThrough]
private Task Delay()
{
    <Delay>d__0 stateMachine = new <Delay>d__0();
    stateMachine.<>t__builder = AsyncTaskMethodBuilder.Create();
    stateMachine.<>4__this = this;
    stateMachine.<>1__state = -1;
    stateMachine.<>t__builder.Start(ref stateMachine);
    return stateMachine.<>t__builder. Task;
}
Run Code Online (Sandbox Code Playgroud)