none
我用webclient下载,根据OpenReadAsync(new Uri(url), zb) 传入不同标识区分下载后的数据处理方法,但是在下载结束处理函数中 有时修zb 混乱掉了 RRS feed

  • 问题

  • 根据OpenReadAsync(new Uri(url), zb) 传入不同标识区分下载后的数据处理方法,但是有多个下载时, zb 混乱掉了
    例如 zb =1 本来应该返回的数据是 abc  zb=2 应该是 aaa(这个程序里根据url不同,返回不同的值)
    但实际在 cl_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    e.

    public  void GeneratePic(Chart chart, string qsrq, string zzrq, string marketid, string code, string fsdate, Stock_ZB zb,Panel cp)
            {
                //首先根据 sqlid 取得数据 对应服务器取数程序 将参数传过去进行替换
                string paras = string.Format("?sqlid={0}&qsrq={1}&zzrq={2}&marketid={3}&code={4}&fsdate={5}", zb.SqlId,qsrq, zzrq, marketid, code, fsdate);
                string url = "http://localhost:7272/ss/cs.ashx" +paras;
                WebClient cl = new WebClient();
                //cl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(cl_DownloadStringCompleted);
                //cl.DownloadStringAsync(new Uri(url), zb); //其中zb.fun对应需要处理的函数
                zb.Schart = chart;
                StockInfo sInfo = new StockInfo { Code = code, MarketId = marketid, Qsrq = qsrq, Zzrq = zzrq, FsData = fsdate, ParentControl=cp};
                zb.PstockInfo = sInfo;
                cl.OpenReadCompleted += new OpenReadCompletedEventHandler(cl_OpenReadCompleted);
                //然后根据 fun 处理数据
                cl.OpenReadAsync(new Uri(url), zb);

            }

     void cl_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
            {
                if (e.Error == null)
                {
                    CompressionHelper ch = new CompressionHelper(); //压缩处理
                    string r = ch.Decompress(e); //解压 服务器端压缩了数据
                    Stock_ZB zb = (Stock_ZB)e.UserState;  //根据不同类型进行处理  多个下载时zb乱掉了
       
    //发现不是zb 中 r不对应了 按理说一个下载对应一个zb ,但实际上却乱掉了,可能 a本来对a的 ,但现在却是 a对b了
                    //根据 zb.fun 调用相应的fun 进行处理
                    //利用反身原理进行调用函数
                    object[] paras = new object[2];
                    paras[0] = r;
                    paras[1] = zb;
                    Type t = typeof(ZbProcess);
                    MethodInfo m = t.GetMethod(zb.Fun);
                    //Type t = Type.GetType("ZbProcess", true, true);
                    //t = Assembly.GetExecutingAssembly().GetType("ZbProcess");
                    //MethodInfo m = t.GetMethod(zb.Fun);
                    object exec = Activator.CreateInstance(t);
                    m.Invoke(exec, paras);
                }
              
            }

    2009年7月10日 9:08

答案

全部回复