想不明白,为什么使用了 async 和 await,还要使用Task?

s0611163 2020-04-15 06:49:08
想不明白,为什么使用了 async 和 await,还要使用Task
那为啥我要用 async 和 await 呢,只用 Task 不就完事了?
难道只是为了少写个Invoke?
懂C#的大神能否解答下?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Utils;

namespace test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

/// <summary>
/// 执行任务
/// </summary>
public string DoWorkNoTask(string str)
{
Thread.Sleep(3000); //模拟延迟 比如网络请求 用了3000毫秒
return "输出:" + str;
}

/// <summary>
/// 执行任务
/// </summary>
public Task<string> DoWork(string str)
{
return Task.Run(() =>
{
Thread.Sleep(3000); //模拟延迟 比如网络请求 用了3000毫秒
return "输出:" + str;
});
}

/// <summary>
/// 输出任务返回值
/// </summary>
public async void OutputResult(TextBox txt, string str)
{
string r = await DoWork(str);

txt.AppendText(r + "\r\n");
}

/// <summary>
/// 测试1
///
/// 调用者加了 async
/// button1_Click 前面加了 async
/// </summary>
private async void button1_Click(object sender, EventArgs e)
{
string r = await DoWork("测试值1");

textBox1.AppendText(r + "\r\n");
}

/// <summary>
/// 测试2
///
/// 调用者没有加 async
/// button2_Click 前面没有加 async
/// </summary>
private void button2_Click(object sender, EventArgs e)
{
OutputResult(textBox1, "测试值2");
}

/// <summary>
/// 测试3
///
/// 不用协程
/// 和使用协程效果一样啊
/// 和使用协程一样,Task.Run是少不了的
/// 只不过要写Invoke
/// 如果不需要输出到界面呢,Invoke不用写,似乎比协程写法还简捷
/// </summary>
private void button3_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
string r = DoWorkNoTask("测试值3");

this.Invoke(new Action(() =>
{
textBox1.AppendText(r + "\r\n");
}));
});
}

/// <summary>
/// 测试4
///
/// 当然这是 async 和 await 的错误用法示例
/// 我希望的 async 的用法是这样的,最简捷
/// 但是,但是,界面卡死了啊!
/// </summary>
private async void button4_Click(object sender, EventArgs e)
{
string r = DoWorkNoTask("测试值4");

textBox1.AppendText(r + "\r\n");
}
}
}
...全文
529 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
s0611163 2020-04-16
  • 打赏
  • 举报
回复
谢谢大佬指点
hztltgg 2020-04-16
  • 打赏
  • 举报
回复
程序一级级往下调用,最底层的那个实现如果耗时用异步,中间的调用过程如果有一级没有使用异步语法支持,那就只能全部变成同步了。但调用逻辑往往是同步的,写成异步繁琐不直观,现在有async和await,就可以在中间过程用同步逻辑写异步语法了, 你的代码,如果DoWorkNoTask返回的是task,那不就简单了么,加一个await就不卡界面了,这个语法还是需要配合的,底层提供task返回。 private async void button4_Click(object sender, EventArgs e) { string r = await DoWorkNoTask("测试值4"); textBox1.AppendText(r + "\r\n"); }
lindexi_gd 2020-04-15
  • 打赏
  • 举报
回复
使用 async和 await 做的是异步的事情,换句话说就是语法提供简单的写法,让你写异步的代码和写同步差不多。详细请看 C# await 高级用法

其实 async 和线程没啥关系,而线程和 await 也没多大关系。只是合并这两个特性能够让软件开发简单起来,方便写出高效率的多线程逻辑

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧