我有以下代码,但问题是,当我在不使用委托线程的情况下执行它时它会顺利但是当我使用委托时它会给我错误:
NullReferenceException未处理,Object Reference未设置为object /
的实例
代码是:
public static string makezip_thread(string [] files,bool IsOriginal)
{
string paths="";
Thread starter = new Thread (delegate(){ paths = Makezipfile(files,IsOriginal);});
starter.IsBackground = true;
starter.Start();
return paths;
}
我的拉链制作班:
public static 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);
}
return a;
}
答案 0 :(得分:3)
在任何情况下,这都不会完全符合您的要求。
通过尝试将其推送到单独的线程中,由于此方法,您可能(可能始终)返回string.Empty
。
原因是您的return paths;
行会在Makezipfile
成功执行之前返回。
如果您希望将其作为异步方法,则需要将其重新设计为异步方法。有许多选项,包括.NET 3.5及更早版本中异步的APM和EAP模型。在.NET 4中,这里最好的选择是将其转换为返回Task<string>
的方法:
public static Task<string> MakeZipAsync(string [] files,bool IsOriginal)
{
return Task.Factory.StartNew( () =>
{
return Makezipfile(files, IsOriginal);
});
}
然后你可以使用它:
var zipTask = MakeZipAsync(files, true);
// Do other work...
// Later, when you need the results, you can block and retrieve them:
var paths = zipTask.Result;