using System.Threading.Tasks; namespace Blue { /// /// 默认查询句柄类 /// public class DefaultQueryHandler : IQueryHandler { /// /// 同步查询 /// public R DoQuery() where Q : IQuery, new() { return DoQuery(new Q()); } /// /// 同步查询 /// public R DoQuery(IQuery query) { return query.DoQuery(); } /// /// 异步查询 /// public IQueryResult DoQueryAsync(IQuery query) { DefaultQueryResult queryResult = new DefaultQueryResult(); var queryTask = Task.Run(() => { return query.DoQuery(); }); var awaiter = queryTask.GetAwaiter(); awaiter.OnCompleted(() => { /* Task.IsFaulted: 获取 Task 是否由于未经处理异常的原因而完成,如果任务引发了未经处理的异常,则为 true;否则为 false Task.IsCanceled 获取此 Task 实例是否由于被取消的原因而已完成执行,如果任务由于被取消而完成,则为 true;否则为 false */ if (queryTask.IsFaulted | queryTask.IsCanceled) { queryResult.TriggerFailed(); } else { queryResult.TriggerSuccess(awaiter.GetResult()); } }); return queryResult; } /// /// 异步查询 /// public IQueryResult DoQueryAsync() where Q : IQuery, new() { return DoQueryAsync(new Q()); } } }