C#中异步方法的使用(task,async,await,TaskCompletionSource相关类的使用)

在C#开发中,经常会有这样一种情况:执行某个方法,但是这个方法的操作并不是马上会有返回值,可能需要等待一段时间,但是这个操作期间,我们要保证程序正常使用,不能出现界面卡死的情况,同时要保证其它操作可以正常使用。那么这种情况下,我们就需要用到异步编程。


首先看看下面的图片:

QQ截图20180223170721.png


在这个程序中,我们有两个按钮,第一个按钮执行异步方法,第二个执行普通方法。


异步方法内部的流程为:

1、向TextBox添加正在执行异步操作的提示信息

2、延迟5秒钟

3、设置异步执行完成标志,并设置返回结果


普通方法的内部流程为:

1、向TextBox添加一条普通信息


首先,我们先点击按钮1,然后程序将进入休眠5秒的操作,按平时的情况的话,假如我们执行Thread.Sleep(5000),我们的程序界面将出现无法拖动及操作的情况。但是在这里,我们使用了异步操作,所以在休眠5秒期间,我们的程序可以正常的拖动及操作,这个时间内,我们可以任意点击按钮2来验证。因为点击按钮2后将向TextBox添加一条提示信息。由此证明我们的程序并没有进入假死状态。


具体的实现代码如下:

//注意方法要加上async标识符,标明是异步方法

private async void btnStart_Click(object sender, EventArgs e)

{

txtLog.Text = "准备开始异步操作…  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine;

string tmpStr = await ExampleMethodAsync();   //调用异步方法,注意要标明await

txtLog.AppendText("异步操作完成,返回值是:" + tmpStr + "  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine);

}


async Task ExampleMethodAsync()

{

txtLog.AppendText("异步操作进行中…  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine);

TaskCompletionSource tcs = new TaskCompletionSource();

await Task.Delay(5000);  //延迟5秒钟

tcs.SetResult("Good Job!");  //当调用SetResult方法时,则表示异步执行完成

return await tcs.Task;   //返回,注意要标明await

}


private void btnNew_Click(object sender, EventArgs e)

{

txtLog.AppendText("这个是普通方法的执行结果!  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine);

}


源码下载:异步方法测试.zip

  1. 本网站所收集的部分资料来源于互联网,本站不对其真实性负责,也不构成任何其他建议。如果您发现有侵犯您权益的内容,请与我们取得联系,我们会及时修改或删除。
  2. 传递知识、传递力量,欢迎各位网友对本站的文章进行转载和分享。
  3. 本站QQ群交流群:904314688  群号:904314688
发表评论
 
评论列表(目前共有 条评论)
暂时还没有评论哦~

文章搜索

商家广告


版权所有:秋风雅居 (www.198933.com) ©2024 All Rights Reserved.

粤ICP备20031662号