110,533
社区成员
发帖
与我相关
我的任务
分享
//方式1:直接Task.Run
private void btnTest_Click(object sender, EventArgs e)
{
Task.Run(new Func<string>(DoForLoop));
}
//方式2:
private void btnTest2_Click(object sender, EventArgs e)
{
DoForLoopAsync();
}
//方式3:加async,await执行
private async void btnTest3_Click(object sender, EventArgs e)
{
await DoForLoopAsync();
}
//普通方法
private string DoForLoop()
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
return "完成";
}
//异步方法
private Task<string> DoForLoopAsync()
{
return Task.Run(() =>
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
return "完成";
});
}
private Task t;
async Task<int> test()
{
var a= 1;
.......
t= new Task(()=>Console.WriteLine("hello")); //这里创建一个任务,任务只是随便打印一句话而已
await t;
......
return a+1;
}
void proc()
{
.......
t.Start();
.......
}
这里,test 执行到中间时就跳出去了。直到另外有某个方法调用 t.Start,就会让 test 跳出的那个语句下边的代码继续被执行。这里看到了 await 功能,看到了环境变量(例如 a)管理功能,看到了一个 async/await 可以返回数据结果给上层的同样结构的 async/await 异步控制结构的功能。 private async void btnTest3_Click(object sender, EventArgs e)
{
DoForLoopAsync();
}
//普通方法
private string DoForLoop()
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
return "完成";
}
//异步方法,此方法不等循环结束,立刻完成
private async void DoForLoopAsync()
{
return Task.Run(() =>
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
return "完成";
});
}
await
关键字。既然是多于写了这个关键字,就说明你还没有明白 await 真正的意义。TcpClient.GetStream().BeginRead(......callback.....)
来注册一个回调委托,那么委托方法里边要调用 EndRead方法,而两个不同代码场景之间的环境变量需要协同,这需要设计一些中间数据结构。public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
btnTest.Click += btnTest_Click;
btnTest2.Click += btnTest2_Click;
btnTest3.Click += btnTest3_Click;
}
//方式1:直接Task.Run
private void btnTest_Click(object sender, EventArgs e)
{
var q = Task.Run(new Func<string>(DoForLoop));
test1.Text = q.Result;
}
//方式2:
private void btnTest2_Click(object sender, EventArgs e)
{
var q = DoForLoopAsync();
test2.Text = q.Result;
}
//方式3:加async,await执行
private async void btnTest3_Click(object sender, EventArgs e)
{
var q = await DoForLoopAsync();
test3.Text = q;
}
//普通方法
private string DoForLoop()
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
Thread.Sleep(2000);
return "完成";
}
//异步方法
private Task<string> DoForLoopAsync()
{
return Task.Run(() =>
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
Thread.Sleep(2000);
return "完成";
});
}
}
最后,当你点击,btnTest1和btnTest2时,整个winform是阻塞的,卡住了。
而btnTest3,是不会阻塞的,他在winform界面,可以继续点击其他的textbox并获得光标。
当然,如果你只是让一个线程去跑,不用返回结果。那完全可以忽视上面的内容。
但是按照楼主的测试用例,其实根本不能支持他的论点。
建议楼主换成我这个,然后在跑一下看看。
顺带,给大家看一下 Result的解释,说白了他是同步的。