汇率多线程 草稿

1.html
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication19.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input name="_method" value="getFxRate"  type="hidden"/>
    <input type="date" name="start" />--<input type="date" name="end" />
    </div>
        <input type="submit" />
    </form>
</body>
</html>

2.cs
using Contract.Domain;
using ETLAPP;
using Framework;
using HraWeb.Common;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using ThreadTemplate;

namespace WebApplication19
{
    public enum SearchRange
    {
        th = 0,
        td = 1
    }
    class ThreadParameters
    {
        public string Url
        {
            get;
            set;
        }
        public string pairId
        {
            get;
            set;
        }
        public string Status
        {
            get;
            set;
        }
        public int PageCount
        {
            get;
            set;
        }
        public int pageIndex
        {
            get;
            set;
        }
    }

    public partial class WebForm1 : BasePage
    {
        public string MKT;
        private System.Data.DataTable table = null;

        private object InitThread(object para)
        {
            List<string> trList = new List<string>();
            var obj = (ThreadParameters)para;
            obj.pageIndex = 1;
            if (table == null)
            {
                table = new System.Data.DataTable();
                table.Columns.Add(new System.Data.DataColumn() { ColumnName = "CURRENCY_PAIR",DataType=typeof(Int64) });
                table.Columns.Add(new System.Data.DataColumn() { ColumnName = "ID",DataType=typeof(Int64) });
                table.Columns.Add(new System.Data.DataColumn() { ColumnName = "FX_RATE" ,DataType=typeof(decimal)});
                table.Columns.Add(new System.Data.DataColumn() { ColumnName = "CAPTURE_DATE",DataType=typeof(DateTime) });
            }
            int pageCount = 0;
            //已经运行了一页的数据
            getData(para,null);
            pageCount = obj.PageCount;
            SubThread thread = new SubThread(1);
            //多线程的最大并发数
            int maxPoolThread = 100;
            int totalThreadNum = pageCount - 1;
            //当前正在运行的线程
            var runingHt = new Dictionary<int, SubThread>();
            //处于等待队列的未运行的线程
            var unRunHt = new Dictionary<int, SubThread>();
            //选取maxPoolThread个线程加入运行队列,其余放入未运行的等待队列
            for (int i = 2; i <= totalThreadNum; i++)
            {
                SubThread th = new SubThread(i);
                th.ThreadAction = a =>
                {
                    obj.pageIndex = i;
                    getData(obj,th);
                    return "";
                };
                if (i <= maxPoolThread)
                {
                    runingHt.Add(i, th);
                    th.Start();
                }
                else
                {
                    unRunHt.Add(i, th);
                }
            }
            while (true)
            {
                //初始化完成队列,用于存取已经执行完的线程的id
                var stepFinishList = new List<int>();

                //将完成的线程放入完成队列
                foreach (int tid in runingHt.Keys)
                {
                    var t = runingHt[tid];
                    if (t.IsStopped)
                    {
                        stepFinishList.Add(tid);
                    }
                }
                //1.遍历完成队列,从当前运行的线程队列中移除该线程
                //2.对完成的线程执行回调,将数据持久化到数据库
                //3.如果等待队列中还有数据,获取等待队列中的第一个,并执行该线程,将该线程从等待队列移除,加入到运行队列

                foreach (int tid in stepFinishList)
                {
                    Thread t1 = new Thread(new ParameterizedThreadStart(saveorupdate));
                    t1.Start(runingHt[tid].ReturnObj);
                    runingHt.Remove(tid);
                    if (unRunHt.Count > 0)
                    {
                        SubThread unRunThread = unRunHt.First().Value;
                        var unRunTid = unRunHt.First().Key;
                        unRunThread.Start();
                        runingHt.Add(unRunTid, unRunThread);
                        unRunHt.Remove(unRunTid);
                    }
                }
                //所有线程都完成后,跳出循环
                if (runingHt.Count == 0 && unRunHt.Count == 0)
                {
                    break;
                }

            }
            //获取一个pairId的数据后立马,保存数据库

           // Holworth.Utility.HraUtility.DataTableWriteToServer(table, "BAS_FX_RATE", "ID", true);
            //table.Clear();
            return "";

        }
        public static Dictionary<string, BasCurrencyPair> dic = new Dictionary<string, BasCurrencyPair>();
        private object getData(object para,SubThread subThread)
        {

            ThreadParameters obj = (ThreadParameters)para;
            obj.Url = obj.Url + "&page=" + obj.pageIndex;
            WebClient wc = new WebClient();
            List<string> trList = new List<string>();
            using (Stream stream = wc.OpenRead(obj.Url))
            {
                using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                {

                    string content = sr.ReadToEnd();
                    string pagePatern = @"var m_nRecordCount = (.*);";
                    var pageMatch = Regex.Match(content, pagePatern);
                    int rows = int.Parse(pageMatch.Groups[1].Value);
                    int pagesize = 20;
                    int pages = (rows / pagesize) + (rows % pagesize == 0 ? 0 : 1);
                    if (obj.pageIndex == 1)
                    {
                        obj.PageCount = pages;
                    }
                    //提取div内容开始
                    string divPatern = @"(?<=<div (.*)?class=""BOC_main publish""[^>]*?>)([\s\S]*?)(?=</div>)";
                    MatchCollection divMatches = Regex.Matches(content, divPatern);
                    string divContent = string.Empty;
                    foreach (Match match in divMatches)
                    {
                        divContent = match.Groups[0].Value;
                        break;
                    }
                    //提取div内容结束

                    //提取表格内容开始
                    string tablePatern = @"(?<=<table (.*)?[^>]*?>)([\s\S]*?)(?=</table>)";
                    MatchCollection tableMatches = Regex.Matches(divContent, tablePatern);
                    string tableContent = string.Empty;
                    foreach (Match match in tableMatches)
                    {
                        tableContent = match.Groups[0].Value;
                        break;
                    }
                    string trPatern = @"(?<=<tr(.*)?[^>]*?>)([\s\S]*?)(?=</tr>)";
                    MatchCollection trMatchCollection = Regex.Matches(tableContent, trPatern);
                    for (int j = 0; j < trMatchCollection.Count; j++)
                    {
                        Match match = trMatchCollection[j];
                        string tr = string.Empty;
                        tr = match.Groups[0].Value;
                        trList.Add(tr);
                    }
                    //提取行结束

                }

                //获取表头列元素,或者内容行的单元格元素 trlist[0]是表头 SearchR,ange告诉程序要查表头 还是 内容行
                List<string> thList = GET_TH_OR_TD_LIST(SearchRange.th, trList[0]);
                System.Collections.ArrayList tdsList = new System.Collections.ArrayList();
                ArrayList list = new ArrayList();

                for (int i = 1; i < trList.Count - 1; i++)
                {
                    BasFxRate row = new BasFxRate();
                    row.CurrencyPair = dic[obj.pairId];
                    var tr = GET_TH_OR_TD_LIST(SearchRange.td, trList[i]);
                    row.FxRate = decimal.Parse(tr[6]);
                    var date = DateTime.Now.Date;
                    DateTime.TryParse(tr[7], out date);
                    row.CaptureDate = date;
                    list.Add(row);

                }
                if(subThread!=null)
                subThread.ReturnObj = list;
                //Thread th = new Thread(saveorupdate);
                //th.Start(list);
                obj.Status = "完成";
            }

            return "子完成";
        }

        private void saveorupdate(object  obj)
        {
            var Dao = (Contract.IService.IDaoService)ctx["DaoService"];
            Dao.SaveOrUpdateAll((ArrayList)obj);
        }

        System.Collections.ArrayList threadList = new System.Collections.ArrayList();

        private List<string> GET_TH_OR_TD_LIST(SearchRange range, string row)
        {
            string tmp = "";
            tmp = range.ToString();
            string tdPatern = $@"(?<=(<{tmp}[^>]*?>))(?<tdCell>[\s\S]*?)(?=</{tmp}>)";
            MatchCollection CurrenttdMatchCollection = Regex.Matches(row, tdPatern);
            string td = string.Empty;
            List<string> tdlList = new List<string>();
            List<string> contentList = new List<string>();
            foreach (Match match in CurrenttdMatchCollection)
            {

                td = match.Groups["tdCell"].Value;
                contentList.Add(td);

            }
            return contentList;

        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request["_method"] == "getFxRate")
            {
                info = new Framework.QueryInfo() { CustomSQL = "select * from BASE_CURRENCY_WEB" };
                var Dao = (Contract.IService.IDaoService)ctx["DaoService"];
                dic=Dao.FindList<BasCurrencyPair>(new QueryInfo() { QueryObject = "BasCurrencyPair" }).ToDictionary(x=>x.Id);
                var ds = Dao.ExcuteDataSet(info);
                var start = Request["start"];
                var end = Request["end"];
                if (string.IsNullOrEmpty(start) || string.IsNullOrEmpty(end))
                {
                    throw new Exception(":输个日期,我的哥!");
                }
                foreach (DataRow row in ds.Tables[0].Rows)
                {
                    //var code = row[""].ToString();
                    var pairId = row["CURRENCY_PAIR_ID"].ToString();
                    var url = string.Format("http://srh.bankofchina.com/search/whpj/search.jsp?erectDate={0}&nothing={1}&pjname={2}", start, end, row["Web_Code"].ToString());
                    var param = new ThreadParameters() { pairId = pairId, Url = url };
                    InitThread(param);
                }
            }

        }
    }
}
3.脚本
CREATE OR REPLACE TRIGGER Bas_Fx_Rate_TRI --表名+“_”+"TRI"
BEFORE INSERT ON Bas_Fx_Rate --表名
FOR EACH ROW
BEGIN
SELECT BAS_MODULE_SEQ.NEXTVAL INTO :NEW.ID--主键ID名称
FROM DUAL;
END;
  
时间: 2024-11-10 14:21:37

汇率多线程 草稿的相关文章

秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. ----------------------

秒杀多线程第一篇 多线程笔试面试题汇总

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. -------------------------------------华丽的分割线

C#中的多线程 - 并行编程 z

原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加入的多线程 API,它们可以充分利用多核处理器. 并行 LINQ(Parallel LINQ)或称为 PLINQ Parallel类 任务并行(task parallelism)构造 SpinLock 和 SpinWait 这些 API 可以统称为 PFX(Parallel Framework,并行

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Spring多线程

Spring是通过TaskExecutor任务执行器来实现多线程和并发编程的.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务. 实例代码: (1)配置类 package com.lwh.highlight_spring4.ch3.taskexecutor; /**

python进阶学习(一)--多线程编程

1. 多线程 概念:简单地说操作系统可以同时执行多个不用程序.例如:一边用浏览器上网,一边在听音乐,一边在用笔记软件记笔记. 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务"一起"执行(实际上总有一些任务不在执行,因为切换任务的熟度相当快,看上去一起执行而已) 并行:指的是任务数小于等于CPU核数,即任务真的是一起执行的. 2. 线程 概念:线程是进程的一个实体,是CPU调度和分派的基本单位. threading--单线程执行: 1 import ti

多线程的实现及其安全问题

一.进程和线程概述 1.进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,简单来说开启一个程序就开启了一个进程: 如果开启多个进程,它们之间是由于CPU的时间片在相互的切换: 2.线程:开启一个进程的一个任务,对于多线程:每一个线程都在争夺CPU的执行权(CPU的执行权具有随机性): 如果一个程序的执行路径有多条,那么该线程是多线程;反之,就单线程线程:线程是依赖于进程存在的! 3.Jvm是多线程 -- 至少开启了两条线程 main方法 主线程 gc() 垃圾回收线程 二.多线程

多线程和多进程的区别与联系

1.单进程单线程:一个人在一个桌子上吃菜.2.单进程多线程:多个人在同一个桌子上一起吃菜.3.多进程单线程:多个人每个人在自己的桌子上吃菜. 多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了...此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢. 1.对于 Windows 系统来说,[开桌子]的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜.因此 Windows 多线程学习重点

Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效率中的差异,注释:在爬虫中我几乎没有使用任何计算性任务,为了探测异步的性能,全部都只是做了网络IO请求,就是说aiohttp把网页get完就程序就done了. 结果发现前者的效率比后者还要高.我询问了另外一位博主,(提供代码的博主没回我信息),他说使用concurrent.futures的话因为我全