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());
}
}
}