在某项目中,因需要对一个通用控件做代码重构,安排一些事件前检查点与事件后检查点,方便在具体业务中,对些通用控件做继承后,加入特定的业务控制逻辑。
在重构代码的的过程中,把主要处理逻辑分成三部分:PreCheck(),Check(),AfterCheck()。又为了方便在各个方法体中使用异步方法获取数据,把三个方法的类型,都定义成Task。这种时就碰到了小问题:如果方法体中,不需要使用异步方法时,如果定义return的值。
经过测试,有了如下发现:如果方法定义为 protected virtual Task PreCheck() 时,需要 return Task.Factory.StartNew(()=> { return true; }); 来对应;但如果定义成 protected virtual async Task 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 PreCheck()
{
if (!await base.PreCheck())
return false;
return await AnotherPreCheck();
}
protected override async Task<bool> Check()
if(someCondiction)
Console.WriteLine("Extend Check");
return true;
return await base.Check();
protected override Task<bool> AfterCheck()
return base.AfterCheck();
private async Task<bool> AnotherPreCheck()
Console.WriteLine("Extend AnotherPrecheck");
return true;
}
深圳网站建设www.sz886.com
在某项目中,因需要对一个通用控件做代码重构,安排一些事件前检查点与事件后检查点,方便在具体业务中,对些通用控件做继承后,加入特定的业务控制逻辑。在重构代码的的过程中,把主要处理逻辑分成三部分:PreCheck(),Check(),AfterCheck()。又为了方便在各个方法体中使用异步方法获取数据,把三个方法的类型,都定义成Task。这种时就碰到了小问题:如果方法体中,不需要使用异步方法时,如...
C#中有个叫做“泛型”的集合,就是说只是个外壳,到底是int,string,bool还是什么类型,都可以按照自己的要求进行定义集合,所以我们用个“T"表示。请看下面代码:01.// Declare the generic class
02.public class GenericList
04. void Add(T input) { }
06.cla
5天玩转C#并行和多线程编程系列文章目录
5天玩转C#并行和多线程编程 —— 第一天 认识Parallel
5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task
5天玩转C#并行和多线程编程 —— 第四天 Task进阶
5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结
一、多线程带...
经过了前面对 coroutine 的反复学习,现在尝试写一些封装好的协程工具(reinventing the wheel)。本文先从最Promise 异步编程模型的最基本的 Task<T> 入手.
Futures and promises - Wikipedia
异步的关键点是真正的无线程异步必须要 all the way down 到 O/S system call 层面甚至到硬件层面的异步支持才能实现 (对于 Linux 的驱动模型, 做 top half 工作的 softirq
根据提示,将返回值由Null改为default(T)即可。
default(T)表示返回当前T类型的默认值,如果T为int则返回0。为了使确实能返回Null,可将该T类型继承自class类 where T : class,变成只能返回引用类型。
重要参考:
http://stackoverflow.com/ques...
PS:在前面章节,我们介绍了Task类开启线程、线程等待、线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的Task<TResult>,然后可以通过Task的实例调用Result属性来获取这个返回值。
下面我们分三类来介绍:
①:线程开启类的返回值, 使用Task<TRe...
本打算继续写SQL Server系列,接下来应该是死锁了,但是在.NET Core项目中到处都是异步,最近在写一个爬虫用到异步,之前不是很频繁用到异步,当用到时就有点缩手缩尾,怕留下坑,还是小心点才是,于是一发不可收拾,发现还是too young,所以再次查看资料学习下Task,用到时再学效果可想而知,若有不同意见请在评论中指出。
建议异步返回Task或Task<T>
当在...
其中,`Func<bool> function` 是一个代表要执行的方法的委托。
使用 `Task.Run<bool>` 可以方便地在异步线程中执行一些耗时的操作,从而避免阻塞主线程。例如,如果要在异步线程中执行一个返回 `true` 或 `false` 的方法 `MyMethod`,可以这样写:
Task<bool> task = Task.Run(() => MyMethod());
bool result = await task;
其中,`await task` 会等待异步线程中的方法执行完毕,并获取其返回值。如果返回值为 `true`,则将其赋值给 `result` 变量。如果返回值为 `false`,则 `result` 变量的值为 `false`。