Task多线程(异步多线程处理)(操作百度翻译API接口)

关于异步多线程处理(操作百度翻译API接口)

近期被Task搞到爆炸,本来写的好好的异步操作,提示各种例如“无await异步操作将按照同步来执行”,由于之前我对于多线程基本等于零了解,这次由于工作需要轻轻松松被一个异步多线程困扰了两个周!!!!整整两个周!

简述要求:通过多线程来进行异步处理大数据,举个简单的例子,将数据库中的某一列中文进行中译英,在进行英译中,存回数据库(EF)。

先进行百度翻译API的整理(此处为借鉴大神的操作)
 public class Translation
        {
            public string Src { get; set; }
            public string Dst { get; set; }
        }

        public class TranslationResult
        {
            //错误码,翻译结果无法正常返回
            public string Error_code { get; set; }
            public string Error_msg { get; set; }
            public string From { get; set; }
            public string To { get; set; }
            public string Query { get; set; }
            //翻译正确,返回的结果
            //这里是数组的原因是百度翻译支持多个单词或多段文本的翻译,在发送的字段q中用换行符(\n)分隔
            public Translation[] Trans_result { get; set; }
        }
        public enum Language
        {
            //百度翻译API官网提供了多种语言,这里只列了几种
            auto = 0,
            zh = 1,
            en = 2,
            cht = 3,
        }
        //对字符串做md5加密
        private static string GetMD5WithString(string input)
        {
            if (input == null)
            {
                return null;
            }
            MD5 md5Hash = MD5.Create();
            //将输入字符串转换为字节数组并计算哈希数据  
            byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
            //创建一个 Stringbuilder 来收集字节并创建字符串  
            StringBuilder sBuilder = new StringBuilder();
            //循环遍历哈希数据的每一个字节并格式化为十六进制字符串  
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            //返回十六进制字符串  
            return sBuilder.ToString();
        }
/// <summary>
        /// 调用百度翻译API进行翻译
        /// 详情可参考http://api.fanyi.baidu.com/api/trans/product/apidoc
        /// </summary>
        /// <param name="q">待翻译字符</param>
        /// <param name="from">源语言</param>
        /// <param name="to">目标语言</param>
        /// <returns></returns>
            private async Task  GetTranslationFromBaiduFanyi(List<CMSPois> Pa , Language from, Language to,string aid,string pd)
        {
            //可以直接到百度翻译API的官网申请
            //一定要去申请,不然程序的翻译功能不能使用
            string appId =aid;
            string password =pd;
            foreach(CMSPois pa in Pa)
            {

                string q = pa.Description;
                if(q==null)
                {
                    continue;
                }
                if (q == "")
                {
                    continue;
                }
                string jsonResult = String.Empty;
                //源语言
                string languageFrom = from.ToString().ToLower();
                //目标语言
                string languageTo = to.ToString().ToLower();
                //随机数
                string randomNum = System.DateTime.Now.Millisecond.ToString();
                //md5加密
                string md5Sign = GetMD5WithString(appId + q + randomNum + password);
                //url
                string url = String.Format("http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from={1}&to={2}&appid={3}&salt={4}&sign={5}",
                    HttpUtility.UrlEncode(q, Encoding.UTF8),
                    languageFrom,
                    languageTo,
                    appId,
                    randomNum,
                    md5Sign
                    );

                WebClient wc = new WebClient();
                try
                {
                    jsonResult = wc.DownloadString(url);
                }
                catch
                {
                    jsonResult = string.Empty;
                }
                //解析json
                JavaScriptSerializer jss = new JavaScriptSerializer();
                TranslationResult result = jss.Deserialize<TranslationResult>(jsonResult);
                if(result.Trans_result[0].Dst==null)
                {
                    continue;
                }

                pa.Description = result.Trans_result[0].Dst;
                string q1 = pa.Description;
                string jsonResult1 = String.Empty;
                //源语言
                string languageFrom1 = to.ToString().ToLower();
                //目标语言
                string languageTo1 = from.ToString().ToLower();
                //随机数
                string randomNum1 = System.DateTime.Now.Millisecond.ToString();
                //md5加密
                string md5Sign1 = GetMD5WithString(appId + q1 + randomNum1 + password);
                //url
                string url1 = String.Format("http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from={1}&to={2}&appid={3}&salt={4}&sign={5}",
                    HttpUtility.UrlEncode(q1, Encoding.UTF8),
                    languageFrom1,
                    languageTo1,
                    appId,
                    randomNum1,
                    md5Sign1
                    );

                WebClient wc1 = new WebClient();
                try
                {
                    jsonResult1 = wc1.DownloadString(url1);
                }
                catch
                {
                    jsonResult1 = string.Empty;
                }
                //解析json
                JavaScriptSerializer jss1 = new JavaScriptSerializer();
                TranslationResult result1 = jss1.Deserialize<TranslationResult>(jsonResult1);
                
                pa.Description = result1.Trans_result[0].Dst;
                pa.LastModificationTime = DateTime.Now;
                    



               
               // Debug.WriteLine("poiId: " + pa.Id+ " " + DateTime.Now+" "+appId);
               
            }
            //保存数据
            PD.SaveChanges();
        }

多线程调用方法

在这里插入图片描述
在这里你填写多少appId与secretKey就代表你开了多少线程
在这里插入图片描述
pois为分页操作,即每个线程平均要处理多少条数据;
在这里插入图片描述
最后进行whenall;

发布了10 篇原创文章 · 获赞 4 · 访问量 2169

猜你喜欢

转载自blog.csdn.net/weixin_45286744/article/details/103356504
今日推荐