C# 基于任务的异步模式的创建与使用的简单示例

摘要:
C#创建和使用基于任务的异步模式的简单示例对于表单程序,使用基于任务异步模式需要一个task类,这在下面的示例中非常简单。这就是为什么你需要使用文本框。调用方法。以上所有代码在此集成。
C# 基于任务的异步模式的创建与使用的简单示例

对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法。

1.创建一个拥有异步方法的类

该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带Async后缀

复制代码

public class Dog
    {
        public Task DoSomthingAsync()
        {
            Task task = Task.Run(() => {
                Console.WriteLine("后台任务开始运行");
                Thread.Sleep(5000);
                Console.WriteLine("后台任务运行结束");
            });
            return task;
        }
    } 

复制代码

当调用该方法的时候,就是异步执行的。为了在该方法执行完成后做进一步处理,需要写一个任务完成后的程序来做点事情,比如更新UI控件。

2.创建任务完成后需要执行的方法

复制代码

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

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

        ///
        ///任务完成后要执行的方法,更新UI
        ///
        private void OnDoSomthingIsComplete(Task t) {
            Action action = () => {
                textBox.Text = "任务完成后显示这段文字到UI控件";
            };
            textBox.Invoke(action);  
        }       
    }
} 

复制代码

对于上面定义的这个OnDoSonthingIsComplete方法,我采用了类似于事件方式的命名规则。
另外,这个方法也和使用BackgroundWorker类一样,并不是在调用者线程上执行的,而是在异步线程中执行的。这就是为什么需要使用textBox.Invoke方法。

3.调用该类的异步方法

在button按下的时候调用。这里把上面所有的代码都整合在一起了。

复制代码

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

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

        private void OnDoSomthingIsComplete(Task t) {//这里的参数:Task t 在下面执行的时候其实就是dog.DoSomthingAsync()
            Action action = () => {
                textBox.Text = "任务完成后显示这段文字到UI控件";
            };
            textBox.Invoke(action);  
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Dog dog = new Dog();
            Task task = dog.DoSomthingAsync().ContinueWith(OnDoSomthingIsComplete);
        }
    }
    /// <summary>
    /// Dog类
    /// </summary>
    public class Dog
    {
        public Task DoSomthingAsync()
        {
            Task task = Task.Run(() => {
                Console.WriteLine("后台任务开始运行");
                Thread.Sleep(5000);
                Console.WriteLine("后台任务运行结束");
            });
            return task;
        }
    }

} 

复制代码

执行效果如下:

 C# 基于任务的异步模式的创建与使用的简单示例第7张

最后再说明下,对于任务执行完成后要执行处理程序,可不不用显式指定方法名,下面用lambda方式会更简练:

复制代码

private void button1_Click(object sender, EventArgs e)
        {
            Dog dog = new Dog();
            Task task = dog.DoSomthingAsync().ContinueWith((Task t)=> {
                Action action = () => {
                    textBox.Text = "任务完成后显示这段文字到UI控件";
                };
                textBox.Invoke(action);
            });
        }

复制代码

作者:feipeng8848

出处:https://www.cnblogs.com/feipeng8848/p/9728707.html

本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。

分类: C#

免责声明:文章转载自《C# 基于任务的异步模式的创建与使用的简单示例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇阿里云云监控-进程监控sql中关于锁的相关知识【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis 在java中的使用

1、首先下载jar包放到你的工程中 2、练习 package com.jianyuan.redisTest; import java.util.Iterator;import java.util.List;import java.util.Set; import redis.clients.jedis.Jedis; public class RedisT...

system()函数

曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入。只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值、它所执行命令的返回值以及命令执行失败原因如何定位,这才是重点。当初因为这个函数风险较多,故抛弃不用,改用其他的方法。这里先不说我用了什么方法,这里必须要搞懂system()函数,因为还是有很多人用...

c# 获取相对路径

c# 获取相对路径 一、获取当前文件的路径1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName获取模块的完整路径,包括文件名。2. System.Environment.CurrentDirectory获取和设置当前目录(该进程从中启动的目录)的完全限定目录。3. Sy...

c# WinForm调用控制台

由于Windows控制台程序是封装在kernel32.dll,所以有必要讲述一下WinForm如何调用动态链接库的步骤。 1.首先需要在调用窗体中申明using System.Runtime.InteropServices; 2.其次需要在C#语言源程序中声明外部方法,格式如下: [DLLImport(“DLL文件”)] 修饰符 extern 返回变量类型...

WPF 下两种图片合成或加水印的方式

最近项目中应用多次应用了图片合成,为了今后方便特此记下。 在WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名空间是System.Drawing 和 System.Drawing.Imaging,另一种是WPF中新添加的API,命名空间是 System.Windows.Media 和 System.Windows.Media.Imag...

windows-System权限获取任意用户权限目录-举例GetTempPath

目录 一丶简介 二丶代码 一丶简介 在System权限启动我们的程序之后.如果程序内部使用了GetTempPath()函数.或者使用了其它跟用户权限有关的函数.则获取的路径不是你想要的.比如 你在System权限下使用了GetTempPath() 那么获取的temp路径有可能就是 "C:WindowsTemp" 而我们想要获取的路径则是 "C:...