C# 不理解异步等待概念

C# 不理解异步等待概念,c#,winforms,async-await,C#,Winforms,Async Await,当我阅读有关async和wait工作的Microsoft文档时,我不明白其中的意思 异步方法旨在成为非阻塞操作。等待 异步方法中的表达式在 等待的任务正在运行。取而代之的是,这个表达式表示其余的 将方法的 异步方法 请考虑我的代码: public Form1() { InitializeComponent(); AsyncTest(); Test(1); } private async void AsyncTest() { HttpClient client

当我阅读有关
async
wait
工作的Microsoft文档时,我不明白其中的意思

异步方法旨在成为非阻塞操作。等待 异步方法中的表达式在 等待的任务正在运行。取而代之的是,这个表达式表示其余的 将方法的 异步方法

请考虑我的代码:

public  Form1()
{
    InitializeComponent();
    AsyncTest();
    Test(1);
}

private async void AsyncTest()
{
    HttpClient client = new HttpClient();
    var ss =  TT(2);

    var s = await ss;

    for (int i = 0; i < 10; i++)
    {
        //loop
    }
}

private async Task<int> TT(int i)
{
    while (true)
    {
        if (i  > 1000000000)
            break;
        i++;
     }

     return  i;
    }
}
public Form1()
{
初始化组件();
异步测试();
试验(1);
}
专用异步void AsyncTest()
{
HttpClient=新的HttpClient();
var-ss=TT(2);
var s=等待ss;
对于(int i=0;i<10;i++)
{
//环路
}
}
专用异步任务TT(int i)
{
while(true)
{
如果(i>100000000)
打破
i++;
}
返回i;
}
}
当我调用AsyncTest()时,它只是在TT方法后面等待,正如它用Wait键指定的那样,但它将控制权返回给主调用者是什么意思?? 它没有返回到form1,如果TT是一个无限循环,它将永远保持不变。
谢谢

在我看来,您是一个需要异步等待的新手。您违反了有关如何使用async Wait的若干规则

要使函数异步,请执行以下操作:

  • 将函数声明为async
  • 返回
    Task
    而不是
    TResult
    ;返回
    Task
    而不是
    void
  • 唯一例外:事件处理程序返回
    void
    而不是
    Task
  • 在异步函数中应该有一个等待。如果忽略此项,编译器将发出警告
  • 在返回之前,请确保等待您调用的所有异步函数
准则:将async作为异步函数的后缀。这允许您创建一个同步和一个异步函数,执行相同的操作:
void MyTest()
Task MyTestAsync()

遵循这些规则,您不能从构造函数中调用异步函数。使用Winforms时,您的代码可能如下所示:

public  Form1()
{
    InitializeComponent();
}

public async void OnButton1_Clicked(object sender, ...)
{   // because this is an event handler the return value is void

    // Start the first test and await until ready
    await TestAsync();

    // Start the second test and await until ready:
    int i = await TestAsync(1);
}
如果您调用一个异步函数,您就会知道该函数中的某个地方有一个wait。如果你有有有意义的事情要做,而内在的功能正在等待,不要等待。在通话后做一些有用的事情,并在需要结果时等待返回的任务:

public async void OnButton2_Clicked(object sender, ...)
{   
    // Start a test, but don't await yet
    var task1 = TestAsync(1);

    // if here, function TestAsync is awaiting somewhere
    // it is not finished yet, so you can't use the result of it
    // But you can do Something else:
    DoSomethingElse();

    // if here you really need the result of TestAsync, await for it
    int i = await task1;

    // if here you know that TestAsync is finished, i has the proper return value
}
您不必一个接一个地开始和等待任务,您可以启动多个任务,并在需要结果时立即等待:

public async void OnButton3_Clicked(object sender, ...)
{   
    // start several tasks. Don't await yet:
    var task1 = TestAsync(1);
    var task2 = TestAsync(2);
    var task3 = TestAsync(3);

    DoSomethingElse();

    // if here I need the results of all three tasks:
    var myTasks = new Task[] {task1, task2, task3};
    await Task.WhenAll(myTasks);
}
一篇真正帮助我理解AsyncAwait的文章是,他将AsyncAwait与一个做早餐的厨师进行了比较。如果厨师必须等水烧开,他不会无所事事地等待,而是环顾四周看看自己是否能做其他事情。在中间搜索某处,等待。< /P>
另一篇帮助我遵循async await准则的文章是

当您编译此代码时,您会收到一条编译器警告,指出
TT
不包含
await
运算符,并且它将同步运行。我建议您根据该警告进行研究,这样会更清楚发生了什么您的for循环是CPU密集型的,不是异步I/O的好替代。非常感谢,实际上我无法理解异步等待和在新线程中调用方法之间的区别!看来他们都是平行的!显然你没读过我建议的Eric Lipprt?异步等待:一个厨师做早餐。每次他必须等水烧开时,他都会环顾四周,看看是否可以做些别的事情,而不是无所事事地等待。New thread=当你在等水的时候,请一个厨师做些别的事情