1. /// <summary>
  2. /// async 异常捕获问题
  3. /// </summary>
  4. /// <param name="context"></param>
  5. /// <returns></returns>
  6. static async Task<string> TestException(string context) {
  7. return string.Format("【{0}】 长度:【{1}】",context,context.Length);
  8. }
  9.  
  10. /// <summary>
  11. /// 该方法无法获取异常
  12. /// </summary>
  13. static void Test1()
  14. {
  15. try
  16. {
  17. //产生异常 无法捕获异常
  18. TestException(null).ContinueWith(r =>{
  19. Console.WriteLine(r.Result);
  20. });
  21. }
  22. catch (Exception ex)
  23. {
  24. throw;
  25. }
  26. }
  27.  
  28. /// <summary>
  29. /// 不能报异常(async与await一起使用)
  30. /// </summary>
  31. /// <returns></returns>
  32. static async Task Test2()
  33. {
  34. string result = await TestException(null);
  35. string test = result;
  36. }
  37.  

Http async / await 方式请求实例:

  1. public static async Task<string> HttpGet(string Url)
  2. {
  3. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
  4. request.Method = "GET";
  5. request.ContentType = "text/html;charset=UTF-8";
  6.  
  7. using (var response =await request.GetResponseAsync())
  8. {
  9. Stream myResponseStream = response.GetResponseStream();
  10. StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
  11. string retString = myStreamReader.ReadToEnd();
  12. return retString;
  13. }
  14. }
  15.  
  16. public static async Task<string> HttpPostAsync(string url, string postData)
  17. {
  18. try
  19. {
  20. byte[] byteArray = Encoding.UTF8.GetBytes(postData);
  21. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  22. request.Method = "POST";
  23. request.ContentType = "application/json";
  24. request.ContentLength = byteArray.Length;
  25. using (Stream myRequestStream = await request.GetRequestStreamAsync())
  26. {
  27. myRequestStream.Write(byteArray, , byteArray.Length);
  28. WebResponse response = request.GetResponse();
  29. StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8"));
  30. return myStreamReader.ReadToEnd();
  31. }
  32. }
  33. catch (Exception ex)
  34. {
  35. Logger.Info(ex);
  36. return string.Empty;
  37. }
  38.  
  39. }
  40.  
  41. public static async Task<string> HttpPostAsync(string url, Dictionary<string,string> paramList)
  42. {
  43. try
  44. {
  45. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  46. StringBuilder sb = new StringBuilder();
  47. foreach (var item in paramList)
  48. {
  49. sb.Append(item.Key + "=" + item.Value + "&");
  50. }
  51. string paramData = sb.ToString().Trim('&');
  52. byte[] data = System.Text.Encoding.UTF8.GetBytes(paramData);
  53. request.Method = "post";
  54. //这句不能少 不难post请求 得不到对应的响应结果
  55. request.ContentType = "application/x-www-form-urlencoded";
  56. using (Stream myRequestStream = await request.GetRequestStreamAsync())
  57. {
  58. myRequestStream.Write(data, , data.Length);
  59. WebResponse response = request.GetResponse();
  60. StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8"));
  61. return myStreamReader.ReadToEnd();
  62. }
  63. }
  64. catch (Exception ex)
  65. {
  66. Logger.Info(ex);
  67. return string.Empty;
  68. }
  69.  
  70. }
  1. /// <summary>
  2. /// PPTV点卡充值
  3. /// </summary>
  4. /// <param name="mobie">手机号</param>
  5. /// <param name="cardnumber">点卡卡密</param>
  6. /// <returns></returns>
  7. public async Task<string> ExchangePPTVCard(string mobie, string cardnumber)
  8. {
  9. string agent = "lemon_act";
  10. string agentkey = "HF0abDEc";
  11. string username = mobie;
  12. //aesyhhxw72453525 月卡
  13. //hnscpyau66772763 半年卡
  14. //mwusrbdu45743377 年卡
  15. //string cardnumber = "hnscpyau66772763";
  16. string urlEncodeUsername = StringHelper.UrlEncode(username);
  17. string sign = StringHelper.MD5(StringHelper.UrlEncode(string.Format("{0}&{1}&{2}",username,cardnumber,agentkey)));
  18. Dictionary<string, string> paramList = new Dictionary<string, string>();
  19. paramList.Add("username", urlEncodeUsername);
  20. paramList.Add("cardnumber", cardnumber);
  21. paramList.Add("agent", agent);
  22. paramList.Add("sign", sign);
  23. string url = "https://api.vip.pptv.com/ppcard/exchange";
  24. string result = await HttpHelper.HttpPostAsync(url, paramList);
  25. UserPPTVCardExchangeResultModel exchangeResult = JsonConvert.DeserializeObject<UserPPTVCardExchangeResultModel>(result);
  26. return result;
  27. }
  1. /// <summary>
  2. /// 充值点卡
  3. /// </summary>
  4. /// <param name="mobile">手机号(手机号必须注册)</param>
  5. /// <param name="cardnumber">点卡卡密</param>
  6. /// <returns></returns>
  7. [HttpGet, Route("ExchangeCard")]
  8. public async Task<Result<bool>> ExchangeCard(string mobile,string cardnumber)
  9. {
  10. Result<bool> result = new Result<bool>();
  11. try
  12. {
  13. string secretKey = Request.Headers.GetValues("SecretKey").FirstOrDefault();
  14. ChannelsService channelservice = new ChannelsService();
  15. int channelId = channelservice.GetChannerIdBySecretKey(secretKey);
  16.  
  17. UsersService userService = new UsersService();
  18. //1.判断手机是否存在
  19. bool isExist = userService.IsRegisterPPTVByMobile(mobile, channelId);
  20. result.ReturnCode = StateCode.Success;
  21. if (!isExist)
  22. {
  23. Logger.Warn(string.Format("【0】手机号尚未注册",mobile));
  24. result.Data = false;
  25. result.ReturnMsg = "该手机尚未注册";
  26. return result;
  27. }
  28. //2.判断该点卡是否可以使用
  29. bool isEnable = await PPTVCardInfo(mobile,cardnumber);
  30. if (!isEnable)
  31. {
  32. Logger.Warn(string.Format("【0】点卡卡密已经被使用", cardnumber));
  33. result.Data = false;
  34. result.ReturnMsg = "该点卡卡密已经被使用";
  35. return result;
  36. }
  37. //3.充值PPTV点卡
  38. bool isChange = await ExchangePPTVCard(mobile, cardnumber);
  39. if (!isChange)
  40. {
  41. result.Data = false;
  42. result.ReturnMsg = "该点卡卡密已经被使用";
  43. return result;
  44. }
  45. result.Data = userService.ExchangePPTVCard(cardnumber);
  46. if (result.Data)
  47. {
  48. result.ReturnMsg = "充值点卡成功";
  49. }
  50. else
  51. {
  52. result.ReturnMsg = "充值点卡失败";
  53. }
  54. }
  55. catch (Exception ex)
  56. {
  57. result.ReturnMsg = "服务器内部发生异常";
  58. Logger.Error("UsersController[ExchangeCard]", ex);
  59. }
  60. return result;
  61. }

 使用Task.Run(()=>{})方式执行

  1. /// <summary>
  2. /// 更新订单状态
  3. /// </summary>
  4. /// <param name="consumptionId">订单ID</param>
  5. /// <param name="totalFee">总费用</param>
  6. /// <param name="status">状态</param>
  7. /// <returns></returns>
  8. public async Task<bool> CheckUserConsumptionStatus(Guid consumptionId, string buyerEmail, decimal totalFee, int status)
  9. {
  10.  
  11. return await Task.Run(() => {
  12. //TODO
  13. return true;
  14.  
  15. });
  16.  
  17. }

Task Asnyc 异常问题的更多相关文章

  1. 记一次Task抛异常,调用线程处理而引发的一些随想

    记一次Task抛异常,调用线程处理而引发的一些随想 多线程调用,任务线程抛出异常如何在另一个线程(调用线程)中捕获并进行处理的问题. 1.任务线程在任务线程执行语句上抛出异常. 例如: private ...

  2. Task异常捕获的方式

    这节来讲一下如果捕获Task的异常. 当Task运行中出现了异常,正常情况下我们在主线程的Try是捕获不到的,而如果在Task内部写try,出现了异常我们会完全不知道.下面就来介绍几个主线程捕获Tas ...

  3. c# .Net并行和多线程编程之Task学习记录!

    任务Task和线程Thread的区别: 1.任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行. 2.任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线 ...

  4. 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  5. C# Task 用法

    C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...

  6. 关于async & await(TAP)异步模型的异常捕获

    在TAP之前,若要捕获线程中Task的异常,通常有两种办法: 1.阻塞:线程开始后,在适当的时机,调用 wait,或waitAll方法. 2.非阻塞(推荐):在建立任务的时候,写该task的conti ...

  7. 关于Task的一点思考和建议

    前言 本打算继续写SQL Server系列,接下来应该是死锁了,但是在.NET Core项目中到处都是异步,最近在写一个爬虫用到异步,之前不是很频繁用到异步,当用到时就有点缩手缩尾,怕留下坑,还是小心 ...

  8. C# Task 源代码(2)

    上篇已经讲到Task 的默认的TaskScheduler 为ThreadPoolTaskScheduler. 这时我们回到原来的task 的start方法,在代码最后,调用了 ScheduleAndS ...

  9. 多线程异步编程示例和实践-Task

    上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...

随机推荐

  1. Nginx实践篇(2)- Nginx作为静态资源web服务 - 控制浏览器缓存、防盗链

    一.控制浏览器缓存 1. 浏览器缓存简介 浏览器缓存遵循HTTP协议定义的缓存机制(如:Expires;Cache-control等). 当浏览器无缓存时,请求响应流程 当浏览器有缓存时,请求响应流程 ...

  2. vue在body上面绑定enter事件

    mounted () { this.bodyListener = (e) => { if (e.keyCode === 13 && e.target === document.b ...

  3. 为什么 管理工具里没有Internet(IIS)管理器选项

    如上图,localhost页能打开了,但是管理工具里没有iis管理器,主要原因是安装iis时候没有选择web管理工具,选取安装上就 有了

  4. 踩过的坑—iphone手机H5样式兼容总结

    对一个前端开发者来说,最煎熬的莫过于"兼容"两个字了(说到这个词朋友们是不是身体一抖),哪怕对于工作多年的老油条来讲,也不是完全了解各种场景下的兼容性处理方法.在这里我就把我在工作 ...

  5. JS with

    <script type="text/javascript"> function Dog(){ this.type="dog"; this.tail ...

  6. Luogu P2743 [USACO5.1]乐曲主题Musical Themes

    链接 \(Click\) \(Here\) 人生第一道后缀数组的题目.首先要对输入的串进行差分处理,差分后长度为(\(n - 1\))的相同子段就是原串中长度为\(n\)的相同(可变调)子段.求出来\ ...

  7. JVM高手之路七(tomcat调优以及tomcat7、8性能对比)

         版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lirenzuo/article/details/77164033 因为每个链路都会对其性能 ...

  8. opencv源码学习: getGaussianKernel( 高斯核);

    参考: https://blog.csdn.net/u012633319/article/details/80921023 二维高斯核, 可以根据下面的公式推到为两个一维高斯核的乘积: 原型: /** ...

  9. 10款Mac上程序员装机必备的开发工具推荐和下载

    10款Mac上程序员装机必备的开发工具推荐和下载 使用Mac的用户主要有两大类:设计师和程序员,为各位程序员童鞋推荐10个Mac上非常棒的开发工具和辅助工具,分享软件专题[10款Mac上程序员装机必备 ...

  10. root登陆欢迎界面设置

    root登陆欢迎界面设置 #!/bin/bash echo -ne "\033[0;36m" cat<<EOF _oo0oo_ (| -_- |) \ = / ___/ ...