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

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

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

1
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重新转换为数组/集合.所以使用了内部类的方式进行的.大家如果知道还请告知一下.

以上内容来源于百科书,可以关注我了解更多.

 

 

posted @   玄之又玄众妙之门  阅读(244)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了

哦哦查

研学服务

知芽网

醉学网

点击右上角即可分享
微信分享提示