2011-02-08 56 views
0

我有下面的代碼,但問題是,當我exucte它不使用代理線程它去順利,但是當我使用委託那麼它給我的埃羅:C#委託類返回值是空

的NullReferenceException了未處理,對象參考不設置爲一個對象的一個​​實例/

的代碼是:

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

有不是足夠信息來回答:

public static Task<string> MakeZipAsync(string [] files,bool IsOriginal) { return Task.Factory.StartNew(() => { return Makezipfile(files, IsOriginal); }); } 

你會再使用這個喜歡問題正確。你是說如果你只是在沒有線程的情況下執行Makezipfile(...),你會得到預期的結果嗎? – 2011-02-08 16:48:38

+0

@ Chris,Shain:是的,如果我不使用線程調用該方法,它就可以,但是當我在線程中使用它時,它會重新提供上面提到的錯誤:( – safi 2011-02-08 16:49:59

回答

3

這是不會做你想要什麼,在任何情況下。

通過試圖將其推入單獨的線程,您可能會(可能總是)返回string.Empty作爲此方法的結果。

原因是您的return paths;行將在Makezipfile可以成功執行之前返回。

如果您希望這是一個異步方法,您需要將其重寫爲異步方法。有許多選項,包括用於.NET 3.5及更早版本中異步的APMEAP模型。在.NET 4中,這裏的最好的辦法是把它變成一個返回Task<string>的方法:這裏

var zipTask = MakeZipAsync(files, true); 
// Do other work... 

// Later, when you need the results, you can block and retrieve them: 
var paths = zipTask.Result;