110,545
社区成员
发帖
与我相关
我的任务
分享
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");
}
}
}