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
- 在异步函数中应该有一个等待。如果忽略此项,编译器将发出警告
- 在返回之前,请确保等待您调用的所有异步函数
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=当你在等水的时候,请一个厨师做些别的事情