c#中返回Task<T>与T的大概用法

在某项目中,因需要对一个通用控件做代码重构,安排一些事件前检查点与事件后检查点,方便在具体业务中,对些通用控件做继承后,加入特定的业务控制逻辑。
在重构代码的的过程中,把主要处理逻辑分成三部分:PreCheck(),Check(),AfterCheck()。又为了方便在各个方法体中使用异步方法获取数据,把三个方法的类型,都定义成Task<T>。这种时就碰到了小问题:如果方法体中,不需要使用异步方法时,如果定义return的值。
经过测试,有了如下发现:如果方法定义为 protected virtual Task<bool> PreCheck() 时,需要 return Task.Factory.StartNew(()=> { return true; }); 来对应;但如果定义成 protected virtual async Task<bool> Check()时,可以直接return true; 来对应;在继承类中也一样的。
示例代码如下:
1、Main方法:
static async System.Threading.Tasks.Task Main(string[] args)
{
var test = new ExtendClass();
await test.Main();
Console.WriteLine("Main Program here");
Console.ReadKey();
}
2、MyBaseClass类
public class MyBaseClass
{
public async Task Main()
{
if (!await PreCheck())
{
Console.WriteLine("PreCheck not pass");
return;
}
else
{
Console.WriteLine("PreCheck pass");
}
if (!await Check())
{
Console.WriteLine("Check not pass");
return;
}
else
{
Console.WriteLine("Check pass");
}
if (!await AfterCheck())
{
Console.WriteLine("AfterCheck not pass");
return;
}
else
{
Console.WriteLine("AfterCheck pass");
}
Console.WriteLine("Well done");
}

protected virtual Task<bool> PreCheck()
{
Console.WriteLine("Base PreCheck");
return Task.Factory.StartNew(()=> { return true; });
}

protected virtual async Task<bool> Check()
{
Console.WriteLine("Base Check");
return true;
}

protected virtual Task<bool> AfterCheck()
{
Console.WriteLine("Base AfterCheck");
return Task.Factory.StartNew(() => { return true; });
}
}
3、ExtendClass类
class ExtendClass:MyBaseClass
{
private bool someCondiction = true;
protected override async Task<bool> PreCheck()
{
if (!await base.PreCheck())
return false;
return await AnotherPreCheck();
}

protected override async Task<bool> Check()
{
if(someCondiction)
{
Console.WriteLine("Extend Check");
return true;
}
else
{
return await base.Check();
}
}

protected override Task<bool> AfterCheck()
{
return base.AfterCheck();
}

private async Task<bool> AnotherPreCheck()
{
Console.WriteLine("Extend AnotherPrecheck");
return true;
}
}

原文地址:https://blog.51cto.com/5179315/2427646

时间: 2024-10-25 13:21:25

c#中返回Task<T>与T的大概用法的相关文章

.NET(C#):await返回Task的async方法

一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用实例方法Start()开启一个新线程,调用Abort()方法来提前终止线程. 使用System.Threading.ThreadPool类,调用静态方法QueueUserWorkItem(),将方法放入线程池队列,线程池来控制调用. 使用BeginInvoke,EndInvoke,BeginRead

Android中关于Task的一些认识

Android中Task是一个逻辑上的概念,简单地说,就是一个栈里面顺序存储着的多个Activity.这些Activity能够是来自同一个App,也能够是来自不同的Apps. Task的创建 比方之前的一个Todo List的Demo,当它被安装到手机上之后,在应用程序列表,也即Launcher中,会有一个图标显示,假设长按这个图标,还能为其在桌面上创建一个快捷方式. 当点击这个图标,或者快捷方式,Todo List中入口的Main Activity就会被创建,而与此同一时候,一个Stack也会

SV中的task和function

SV中的Task和Function不需要,必须加一个begin..end来指明body. task    muliple_line; ......body... endtask :multiple_line 子程序在执行到子程序的最后一行就返回,将返回值赋给与函数同名的变量,也可以显式的调用return来返回. SV中module和program的子程序默认是静态存储的,当需要动态存储时,仍然需要显式的用automatic显式指出.(class中默认是automatic的) 子程序中的参数缺省值

三种方法实现从“一个(组)查询过程中返回两个表的查询结果”

还记得開始做机房的时候,遇到了要从一个函数中返回两个表的查询结果.当时的解决方法非常"冲动"也非常"无拘无束",直接在实体类里边加入了其它表的实体,效果是达到了,但总认为不伦不类. 如今介绍三种解决上述问题的方法(代码为VB.net.系统使用三层架构). 题设要求:如果我如今要从卡表和学生表里返回查询信息(卡表的comment,money,status和学生表的所有信息),卡表和学生表例如以下: 图一  学生表 图二    卡表 方法一:视图. 比較简单,相信这样的

Linux中的task,process, thread 简介

本文的主要目的是介绍在Linux内核中,task,process, thread这3个名字之间的区别和联系.并且和WINDOWS中的相应观念进行比较.如果你已经很清楚了,那么就不用往下看了. LINUX版本:2.6.18ARCH: X86 首先要明确的是,按照LKD 2里面的说法,LINUX和其他OS 比如WINDOWS, SOLARIS之间一个很大的不同是没有严格定义的线程(thread).那么你也许会问,如果LINUX中没有线程,那么如何来表示类似WINDOWS 线程的那种执行观念呢?答案是

SQLSERVER中返回修改后的数据

在公司看到同事写了个SQL2005的新特性的文章,觉得很实用,在这里和大家分享下. 这种技术主要是用到了inserted和deleted虚拟表,这两张表相信大家都很熟悉.以前我们主要是在触发器中使用. 我们先来复习下这两个表: Inserted和Deleted这两个表是逻辑表,并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此,不允许用户直接对其修改.这两个表的结构与被该触发器作用的表在相同的表结构.这两个表是动态驻留在内存中的,当触发器工作完成,它们也被删除. 接下来,看看我们

在Java 线程中返回值的用法

http://icgemu.iteye.com/blog/467848 在Java 线程中返回值的用法 博客分类: Java Javathread 有时在执行线程中需要在线程中返回一个值:常规中我们会用Runnable接口和Thread类设置一个变量:在run()中改变变量的值,再用一个get方法取得该值,但是run何时完成是未知的:我们需要一定的机制来保证. 在在Java se5有个Callable接口:我们可以用该接口来完成该功能: 代码如: Java代码   package com.thr

在JS方法中返回多个值的三种方法

在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: <html> <head> <title>JS函数返回多个值--oec2003</title> </head> <body> <input type="button" onclick="getNames()" value="test" /> &

实现一个算法从一个单链表中返回倒数第n个元素(keep it up)

我们维护两个指针, 它们之间的距离为n.然后,我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变.那么, 当第二个指针指到空时,第一个指针即为所求. #include <iostream> struct Node { int data; Node* next; }; void initList(Node* vNode) { for (int i=0; i < 20; ++i) { Node* TempNode = new Node; TempNode->data =