您的位置:首页 > 编程语言 > C#

c#的async和await

2020-04-02 08:03 871 查看

async和await一般成对出现
async出现在方法名里面
而await在里面,await要放在Task前面
单独用没用的

private static async Task 线程()
{
Console.WriteLine("线程启动");
TaskFactory tf = new TaskFactory();
Task task = tf.StartNew(() =>
{
Console.WriteLine($"这是线程{Thread.CurrentThread.ManagedThreadId},启动");
});
await task;
//await相当于把后面的都用ContinueWith包起来
//task.ContinueWith(t =>
//{
//    Console.WriteLine();
//});
Console.WriteLine($"这是最后执行的线程,但是是主线执行,还是分线程执行,不确定,此时是{Thread.CurrentThread.ManagedThreadId}");
}

这其实就是一种封装的语法糖
把先执行的和后执行的用await分开
而await就相当于把后面的代码包住,相当于ContinueWith,而且访问到,就回调到主线程执行,而最后再执行后面的,但是await后面的是主线程还是分线程执行是不确定的
这边做个例子

private static async Task 主线程()
{
Console.WriteLine($"主线程1");
子线程();
Console.WriteLine($"主线程2");
}
private static async Task 子线程()
{
Console.WriteLine($"子线程1");
await Task.Run(() => {
Thread.Sleep(200);
Console.WriteLine($"子线程2");
});
Console.WriteLine($"子线程3");
}

此时是先出现主线程1,然后进入子线程,返回子线程1,然后碰见await,回调到主线程,然后主线程跑主线程的,子线程跑子线程的,主线程返回主线程2,主线程返回子线程2,3

然后如果有返回值,只需要在方法名的Task后面加上返回的值,然后调用只需要用Result即可

private static async Task<int> 线程()//返回int
int a=线程.Result
  • 点赞
  • 收藏
  • 分享
  • 文章举报
漫漫长路,慢慢走 发布了12 篇原创文章 · 获赞 2 · 访问量 233 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: