首页 > Windows开发 > 详细

C#控件回调事件中使用异步操作的方法

时间:2021-07-18 23:31:54      阅读:34      评论:0      收藏:0      [点我收藏+]

注意点

asyncawait关键字一般成对出现,表示是异步函数。
同时,被调用的异步函数返回值类型是Task

// 按钮事件
private void BtnTaskAwait_Click(object sender, EventArgs e)
{
  Debug.WriteLine("BtnTaskAwait_Click begin.");
  ExecuteTask(sender, e);
  Debug.WriteLine("BtnTaskAwait_Click end.");
}

// 执行短暂的同步操作,启动异步操作
private async void ExecuteTask(object sender, EventArgs e)
{
  Debug.WriteLine("ExecuteClickTaskAsync begin.");
  textBox1.Text = "";
  progressBar1.Visible = true;
  await DoSomethingAsync(sender, e);
  progressBar1.Visible = false;
  Debug.WriteLine("ExecuteClickTaskAsync end.");
}

// 执行耗时的异步操作
private async Task DoSomethingAsync(object sender, EventArgs e)
{
  //await Task.Run(() =>
  //{
  //  //Task.Delay(TimeSpan.FromSeconds(5));
  //  System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5));
  //});

  await Task.Run(() =>
  {
    textBox1.Invoke((MethodInvoker)(() =>
    {
      textBox1.Text = "Task async UI: Sleep 5 second.";
    }));
    var sw = new Stopwatch();
    sw.Start();
    while (sw.Elapsed.TotalSeconds < 5)
    {
      int val = (int)(sw.Elapsed.TotalSeconds / 5 * 100) % 100;
      progressBar1.Invoke((MethodInvoker)(() =>
      {
        progressBar1.Value = val;
      }));
      Task.Delay(TimeSpan.FromMilliseconds(1));
    }
    textBox1.Invoke((MethodInvoker)(() =>
    {
      textBox1.Text = "Task async UI: Finished.";
    }));
  });
}

以下Debug输出,可以看出是异步执行的。

BtnTaskAwait_Click begin.
ExecuteClickTaskAsync begin.
BtnTaskAwait_Click end.
ExecuteClickTaskAsync end.

C#控件回调事件中使用异步操作的方法

原文:https://www.cnblogs.com/octoberkey/p/15027930.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!