c#线程池使用之_回调方法中传递多个参数的处理

如题,在这里主要是做个关于线程池使用过程中回调方法需要用到多个参数的时候的场景

 

下面中的代码做个例子:我需要用到一个WebClientDown2来去远程地址下载一个文件保存到本地.因为需要访问的次数过多(上十万+),所以打算用到线程池进行加快下载.WebClientDown2方法中接收2个参数path(远程下载地址),filePath(本地文件存放地址)

 ThreadPool.QueueUserWorkItem(new WaitCallback(WebClientDown2), new Demo { path = path, filePath = (filePath + "\\" + y + ".png") });

因为QueueUserWorkItem方法中接收的参数一个时回调方法,一个是obj所以我在参考了网上的说法以后创建了一个内部类Demo进行存放参数

  public class Demo
        {
            public string path { get; set; }
            public string filePath { get; set; }

        }

WebClientDown2方法内通过强制转换的方式获取到传入的参数

  public static void WebClientDown2(object o)
        {
            Demo d = (Demo)o;
            string URLAddress = d.path;
            string path = d.filePath;
            WebClient client = new WebClient();
            Stream str = client.OpenRead(URLAddress);
            StreamReader reader = new StreamReader(str);
            byte[] mbyte = new byte[1000000];
            int allmybyte = (int)mbyte.Length;
            int startmbyte = 0;

            while (allmybyte > 0)
            {

                int m = str.Read(mbyte, startmbyte, allmybyte);
                if (m == 0)
                    break;

                startmbyte += m;
                allmybyte -= m;
            }

            reader.Dispose();
            str.Dispose();

            //  string path = receivePath + System.IO.Path.GetFileName(URLAddress);
            FileStream fstr = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
            fstr.Write(mbyte, 0, startmbyte);
            fstr.Flush();
            fstr.Close();
        }

当然大家也可以使用数组/集合的方式进行保存参数,不过我自己不知道怎么把obj重新转换为数组/集合.所以使用了内部类的方式进行的.大家如果知道还请告知一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值