如题,在这里主要是做个关于线程池使用过程中回调方法需要用到多个参数的时候的场景
下面中的代码做个例子:我需要用到一个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重新转换为数组/集合.所以使用了内部类的方式进行的.大家如果知道还请告知一下