我在另一个类中调用此zip_threading类。 string a = zip_threading(?,?)但问题是我在调用这个类时如何传递参数值:String [] files,bool IsOriginal。我在这个类后台工作线程中使用过,所以真正的问题是将值传递给这个类,然后在make_zip_file类中完成处理时返回一个值。
public class zip_threading
{
public string[] files { get; set; } // to be recieved by the zip method as zip file names.
public int number;
public string return_path;
public bool IsOriginal { get; set; } // to be recieved by the zip method as boolean true or fales
public static BackgroundWorker bgw1 = new BackgroundWorker(); // make a background worker object.
public void bgw1_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
{
make_zip_file mzf1 = e.Result as make_zip_file;
return_path = mzf1.return_path;
}
public make_zip_file bgw_DoWork(string[] files, bool IsOriginal, make_zip_file argumentest)
{
Thread.Sleep(100);
argumentest.return_path = argumentest.Makezipfile(files,IsOriginal);
return argumentest;
}
public void run_async(string []files,bool IsOriginal)
{
make_zip_file mzf2 = new make_zip_file();
// mzf2.files = files;
//mzf2.IsOriginal = IsOriginal;
bgw1.DoWork += (sender, e) => e.Result = bgw_DoWork(files, IsOriginal, mzf2);
bgw1.RunWorkerAsync();
}
public class make_zip_file
{
public string return_path ;
//public string[] files{get;set;}
// public bool IsOriginal{get;set;}
public string Makezipfile(string[] files, bool IsOriginal)
{
string[] filenames = new string[files.Length];
if (IsOriginal)
for (int i = 0; i < files.Length; i++)
***filenames[i] = HttpContext.Current.Request.PhysicalApplicationPath + files[i].Remove(0, 10).ToString();***
else
for (int i = 0; i < files.Length; i++)
***filenames[i] = HttpContext.Current.Request.PhysicalApplicationPath + files[i].Replace(HttpContext.Current.Request.UrlReferrer.ToString(), "");***
string DirectoryName = filenames[0].Remove(filenames[0].LastIndexOf('/'));
DirectoryName = DirectoryName.Substring(DirectoryName.LastIndexOf('/') + 1).Replace("\\", "");
try
{
string newFile = HttpContext.Current.Request.PhysicalApplicationPath + "images\\Thumbnails\\zipFiles\\" + DirectoryName + ".zip";
if (File.Exists(newFile))
File.Delete(newFile);
using (ZipFile zip = new ZipFile())
{
foreach (string file in filenames)
{
string newfileName = file.Replace("\\'", "'");
zip.CompressionLevel = 0;
zip.AddFile(newfileName, "");
}
zip.Save(newFile);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception during processing {0}", ex);
// No need to rethrow the exception as for our purposes its handled.
}
return_path = "images/Thumbnails/zipFiles/" + DirectoryName + ".zip";
return return_path;
}}
现在我在其他类中调用此方法:像这样
String path=zipa.run_async(fileCollection, IsOriginal);
我在make_Zip_File中遇到错误,我用以下标记:对象引用未设置为对象的实例* filenames [i] = HttpContext.Current.Request.PhysicalApplicationPath + files [i] .Remove(0,10)的ToString(); *
答案 0 :(得分:1)
通过将其带到另一个线程,您正在运行http-context的外部,这可能会在您的zip操作完成之前很久就完成(拆除所有内容,如入站流缓冲区) - 但你正在和HttpContext.Current
交谈。
你有几个选择;想到了我的头脑......
但要重新迭代:你无法从另一个线程访问请求 - 或者至少,你不应该这样做。
另外,请考虑:
你需要考虑你要用zip文件名做什么;你不能只是把它交给客户 - 他们不再听你的了。
答案 1 :(得分:0)
检查文件[i]是否已初始化,因为它来自函数的某个地方
Makezipfile(string[] files, bool IsOriginal)
{
}
我认为它没有任何价值。