在C#中使用通用约束返回Task的异步方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在C#中使用通用约束返回Task的异步方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1816字,纯文字阅读大概需要3分钟。
内容图文
![在C#中使用通用约束返回Task的异步方法](/upload/InfoBanner/zyjiaocheng/658/ee3cc05e6c23477b85a427431792997b.jpg)
我已经在a project I’m working on中实现了命令模式.这几乎是当前结构:
public class Response
{
public bool Success { get; private set; }
public static Response CreateErrorResponse()
{
return new Response { Success = false };
}
}
public interface ICommand<T> where T : Response
{
Task<T> ExecuteAsync();
}
public abstract CommandBase : ICommand<T> where T: Response
{
protected abstract Uri BuildUrl();
protected abstract Task<T> HandleResponseAsync();
public async override Task<T> ExecuteAsync()
{
var url = BuildUrl();
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
return await HandleResponseAsync(response);
}
}
我想处理HttpClient可能引发的任何异常,因此我想将CommandBase.ExecuteAsync更改为类似的内容…
public async override Task<T> ExecuteAsync()
{
var url = BuildUrl();
var httpClient = new HttpClient();
try
{
var response = await httpClient.GetAsync(url);
return await HandleResponseAsync(response);
}
catch (HttpRequestException hex)
{
return Response.CreateErrorResponse(); // doesn't compile
}
}
我得到的编译错误是“无法将类型Response转换为异步返回类型T”.如in this question所述,我无法使用T.CreateErrorResponse().
我该如何解决?
编辑下降投票者:您是否同意在这样的库中捕获异常,问题仍然存在!
解决方法:
尽管我不确定这是否是最佳解决方案(或在您的特定用例中是否可行),但是您可以执行以下操作:
public class Response
{
public bool Success { get; private set; }
public ExceptionDispatchInfo ErrorInfo { get; private set; }
public bool HasFailed
{
get { return !Success; }
}
public static T CreateErrorResponse<T>(ExceptionDispatchInfo errorInfo) where T : Response, new()
{
var response = new T();
response.Success = false;
response.ErrorInfo = errorInfo;
return response;
}
}
用法:
catch (HttpRequestException hex)
{
return Response.CreateErrorResponse<T>(ExceptionDispatchInfo.Capture(hex)); // should compile (I did not check)
}
内容总结
以上是互联网集市为您收集整理的在C#中使用通用约束返回Task的异步方法全部内容,希望文章能够帮你解决在C#中使用通用约束返回Task的异步方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。