c#Delegate Class返回值为空

时间:2011-02-08 16:45:58

标签: c# delegates

我有以下代码,但问题是,当我在不使用委托线程的情况下执行它时它会顺利但是当我使用委托时它会给我错误:

  

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;

}

1 个答案:

答案 0 :(得分:3)

在任何情况下,这都不会完全符合您的要求。

通过尝试将其推送到单独的线程中,由于此方法,您可能(可能始终)返回string.Empty

原因是您的return paths;行会在Makezipfile成功执行之前返回。

如果您希望将其作为异步方法,则需要将其重新设计为异步方法。有许多选项,包括.NET 3.5及更早版本中异步的APMEAP模型。在.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;