Task Asnyc 异常问题
/// <summary>
/// async 异常捕获问题
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
static async Task<string> TestException(string context) {
return string.Format("【{0}】 长度:【{1}】",context,context.Length);
} /// <summary>
/// 该方法无法获取异常
/// </summary>
static void Test1()
{
try
{
//产生异常 无法捕获异常
TestException(null).ContinueWith(r =>{
Console.WriteLine(r.Result);
});
}
catch (Exception ex)
{
throw;
}
} /// <summary>
/// 不能报异常(async与await一起使用)
/// </summary>
/// <returns></returns>
static async Task Test2()
{
string result = await TestException(null);
string test = result;
}
Http async / await 方式请求实例:
public static async Task<string> HttpGet(string Url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8"; using (var response =await request.GetResponseAsync())
{
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
return retString;
}
} public static async Task<string> HttpPostAsync(string url, string postData)
{
try
{
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = byteArray.Length;
using (Stream myRequestStream = await request.GetRequestStreamAsync())
{
myRequestStream.Write(byteArray, , byteArray.Length);
WebResponse response = request.GetResponse();
StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8"));
return myStreamReader.ReadToEnd();
}
}
catch (Exception ex)
{
Logger.Info(ex);
return string.Empty;
} } public static async Task<string> HttpPostAsync(string url, Dictionary<string,string> paramList)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
StringBuilder sb = new StringBuilder();
foreach (var item in paramList)
{
sb.Append(item.Key + "=" + item.Value + "&");
}
string paramData = sb.ToString().Trim('&');
byte[] data = System.Text.Encoding.UTF8.GetBytes(paramData);
request.Method = "post";
//这句不能少 不难post请求 得不到对应的响应结果
request.ContentType = "application/x-www-form-urlencoded";
using (Stream myRequestStream = await request.GetRequestStreamAsync())
{
myRequestStream.Write(data, , data.Length);
WebResponse response = request.GetResponse();
StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8"));
return myStreamReader.ReadToEnd();
}
}
catch (Exception ex)
{
Logger.Info(ex);
return string.Empty;
} }
/// <summary>
/// PPTV点卡充值
/// </summary>
/// <param name="mobie">手机号</param>
/// <param name="cardnumber">点卡卡密</param>
/// <returns></returns>
public async Task<string> ExchangePPTVCard(string mobie, string cardnumber)
{
string agent = "lemon_act";
string agentkey = "HF0abDEc";
string username = mobie;
//aesyhhxw72453525 月卡
//hnscpyau66772763 半年卡
//mwusrbdu45743377 年卡
//string cardnumber = "hnscpyau66772763";
string urlEncodeUsername = StringHelper.UrlEncode(username);
string sign = StringHelper.MD5(StringHelper.UrlEncode(string.Format("{0}&{1}&{2}",username,cardnumber,agentkey)));
Dictionary<string, string> paramList = new Dictionary<string, string>();
paramList.Add("username", urlEncodeUsername);
paramList.Add("cardnumber", cardnumber);
paramList.Add("agent", agent);
paramList.Add("sign", sign);
string url = "https://api.vip.pptv.com/ppcard/exchange";
string result = await HttpHelper.HttpPostAsync(url, paramList);
UserPPTVCardExchangeResultModel exchangeResult = JsonConvert.DeserializeObject<UserPPTVCardExchangeResultModel>(result);
return result;
}
/// <summary>
/// 充值点卡
/// </summary>
/// <param name="mobile">手机号(手机号必须注册)</param>
/// <param name="cardnumber">点卡卡密</param>
/// <returns></returns>
[HttpGet, Route("ExchangeCard")]
public async Task<Result<bool>> ExchangeCard(string mobile,string cardnumber)
{
Result<bool> result = new Result<bool>();
try
{
string secretKey = Request.Headers.GetValues("SecretKey").FirstOrDefault();
ChannelsService channelservice = new ChannelsService();
int channelId = channelservice.GetChannerIdBySecretKey(secretKey); UsersService userService = new UsersService();
//1.判断手机是否存在
bool isExist = userService.IsRegisterPPTVByMobile(mobile, channelId);
result.ReturnCode = StateCode.Success;
if (!isExist)
{
Logger.Warn(string.Format("【0】手机号尚未注册",mobile));
result.Data = false;
result.ReturnMsg = "该手机尚未注册";
return result;
}
//2.判断该点卡是否可以使用
bool isEnable = await PPTVCardInfo(mobile,cardnumber);
if (!isEnable)
{
Logger.Warn(string.Format("【0】点卡卡密已经被使用", cardnumber));
result.Data = false;
result.ReturnMsg = "该点卡卡密已经被使用";
return result;
}
//3.充值PPTV点卡
bool isChange = await ExchangePPTVCard(mobile, cardnumber);
if (!isChange)
{
result.Data = false;
result.ReturnMsg = "该点卡卡密已经被使用";
return result;
}
result.Data = userService.ExchangePPTVCard(cardnumber);
if (result.Data)
{
result.ReturnMsg = "充值点卡成功";
}
else
{
result.ReturnMsg = "充值点卡失败";
}
}
catch (Exception ex)
{
result.ReturnMsg = "服务器内部发生异常";
Logger.Error("UsersController[ExchangeCard]", ex);
}
return result;
}
使用Task.Run(()=>{})方式执行
/// <summary>
/// 更新订单状态
/// </summary>
/// <param name="consumptionId">订单ID</param>
/// <param name="totalFee">总费用</param>
/// <param name="status">状态</param>
/// <returns></returns>
public async Task<bool> CheckUserConsumptionStatus(Guid consumptionId, string buyerEmail, decimal totalFee, int status)
{ return await Task.Run(() => {
//TODO
return true; }); }
Task Asnyc 异常问题的更多相关文章
- 记一次Task抛异常,调用线程处理而引发的一些随想
记一次Task抛异常,调用线程处理而引发的一些随想 多线程调用,任务线程抛出异常如何在另一个线程(调用线程)中捕获并进行处理的问题. 1.任务线程在任务线程执行语句上抛出异常. 例如: private ...
- Task异常捕获的方式
这节来讲一下如果捕获Task的异常. 当Task运行中出现了异常,正常情况下我们在主线程的Try是捕获不到的,而如果在Task内部写try,出现了异常我们会完全不知道.下面就来介绍几个主线程捕获Tas ...
- c# .Net并行和多线程编程之Task学习记录!
任务Task和线程Thread的区别: 1.任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行. 2.任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线 ...
- 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- C# Task 用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
- 关于async & await(TAP)异步模型的异常捕获
在TAP之前,若要捕获线程中Task的异常,通常有两种办法: 1.阻塞:线程开始后,在适当的时机,调用 wait,或waitAll方法. 2.非阻塞(推荐):在建立任务的时候,写该task的conti ...
- 关于Task的一点思考和建议
前言 本打算继续写SQL Server系列,接下来应该是死锁了,但是在.NET Core项目中到处都是异步,最近在写一个爬虫用到异步,之前不是很频繁用到异步,当用到时就有点缩手缩尾,怕留下坑,还是小心 ...
- C# Task 源代码(2)
上篇已经讲到Task 的默认的TaskScheduler 为ThreadPoolTaskScheduler. 这时我们回到原来的task 的start方法,在代码最后,调用了 ScheduleAndS ...
- 多线程异步编程示例和实践-Task
上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...
随机推荐
- Linux记录
多语言环境镜像使用手册 vi和vim上查找字符串 vim 的安装及配置 Linux下的tar压缩解压缩命令详解 vim配置之——ctags与TagList的配置以及NERDTree && ...
- js原生事件系统与坐标系统
今天来实现一个可兼容的js原生拖拽,在这里面我将会讲到: 1.封装兼容性的事件系统. 2.封装得到鼠标当前位置的系统. 3.完成拖拽的实现. 首先,我们要讲到鼠标位置的获取,讲到这个,就离不开js的w ...
- Privoxy将Socks代理转化HTTP代理
使用步骤 安装Privoxy sudo pacman -S privoxy # Arch Linux 创建配置文件 mkdir -p ~/.config/privoxy 向~/.config/priv ...
- MVC过滤器处理Session过期
一.自定义一个Action过滤器 public class CheckSession: ActionFilterAttribute { public override void OnActionExe ...
- (七)修改上一条SQL语句,NULL值的滤空函数nvl
修改上一条SQL语句 1.用c命令来修改(c 即 change ) 默认,光标闪烁位置指向上一条SQL语句的第一行.输入二则定位到第二行. c /错误的关键字/正确的关键字 SQL form emp; ...
- 安全测试之Top 10 漏洞的分析
1. 问题:没有被验证的输入 测试方法: 数据类型(字符串,整型,实数,等) 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值(枚举型) 特定的模式 ...
- HTML学习笔记Day15
一.CSS3渐变 (一).CSS3渐变(gradient)可以让你在两个或多个指定的颜色之间显示平稳的过度:渐变效果比使用图片在放大时看起来效果更好,因为渐变(gradient)是由浏览器生成的 1. ...
- MySQL信息提示不是英文问题
安装好MySQL后,运行SQL的提示信息总不是英文mysql> select database; ERROR 1064 (42000): 安装好MySQL后,运行SQL的提示信息总不是英文 my ...
- 图形设计必备软件:CorelDRAW
[CorelDRAW 激发创意] CorelDRAW Graphics Suite 是一款领先的图形设计软件,收到数百万专业人士.小型企业主以及全球设计爱好者的热捧.它可以提供无缝的图形.版面.插图. ...
- 42套JavaScript深度解析教学视频!合集
本文首发于:风云社区SCOEE(社区旨在普惠软件.图片.音乐.视频.素材.文档等互联网资源.为大众提供多样化的服务,以及主要涵盖学术科学.电脑技术.文化人文.体育健身等领域的知识和信息,获得用户的支持 ...