首页 新闻 会员 周边

C# 直接调用task方法和通过task.run、await 调用task方法有什么区别吗?

1
悬赏园豆:20 [已解决问题] 解决于 2019-07-17 23:12

比如:

1)TaskMethod();

2) Task.Run(async () =>

{

await TaskMethod();

};

3)await TaskMethod();

这几种调用方式有什么区别吗?

另外,如果Task方法内包含await我还需要在调用时添加await吗?

孙月魂的主页 孙月魂 | 初学一级 | 园豆:186
提问于:2019-07-17 16:00
< >
分享
最佳答案
0

1)异步执行 TaskMethod 但不等待它执行完成就继续执行后续代码
2)从线程池中拿一个新的线程执行 TaskMethod ,其他与1相同
3)异步执行 TaskMethod ,释放当前线程 -> 等待 -> TaskMethod 执行完成 -> 继续执行后续代码

收获园豆:20
dudu | 高人七级 |园豆:31003 | 2019-07-17 16:35

谢谢大佬!还想问下如果调用的TaskMethod里面有await语句也不会引起原方法产生阻塞吧?

孙月魂 | 园豆:186 (初学一级) | 2019-07-17 17:32

@孙月魂: await 本来就是为了避免阻塞,它的作用是释放当前线程,

dudu | 园豆:31003 (高人七级) | 2019-07-17 17:52

@dudu 非常感谢!

孙月魂 | 园豆:186 (初学一级) | 2019-07-17 21:23
其他回答(1)
0

1.利用Thread新建线程和调用Task都是用非主线程异步执行工作,主线程不等待,不同点是Task使用线程池线程,任务结束后线程不会销毁,资源开销相对于Thread新建线程相对小一点。
2.Task和直接Task.Run没有区别。
3.利用await只能调用有async声名的方法主线程在await处等待异步执行结果,但是此时主线程不会被阻塞掉。(如果此时主线程不去处理其他的事情,那么和Thread调用线程,对于使用者来说是没有区别的)

彭小立 | 园豆:634 (小虾三级) | 2019-09-23 15:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册