欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c# 异步、重入、Async、Await

程序员文章站 2024-01-28 11:25:46
...

如果提示 Task不包含GetAwaiter的定义,请将项目的目标框架改到4.5及以上

using System;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Threading;

namespace async
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.AutoSize = true;
        }
        private void button1_Click(object sender, EventArgs e)
        {            
            if (!button1.Enabled) return;//防止重入,设置Enabled后事件未结束前仍然可能进入
            button1.Enabled = false;
            Does();//异步方法,未使用 await 不会阻塞,将继续执行下去
            button1.Text = "读取中,请稍候…";
        }
        //线程的高级版本
        private Task<string> DoWork()
        {
            return Task.Run(() => { Thread.Sleep(4000); return "读取完成!"; });
        }
        //此方法执行后不影响窗体的运行
        private async void Does()
        {
            string text = await DoWork();//使用 await 调用Task,将等待返回结果
            button1.Text = text;
            button1.Enabled = true;
        }
    }
}