2011-02-08 3 views
0

у меня есть следующий код, но проблема в том, что, когда я exucte ее без использования делегата нить она идет гладко, но когда я использую делегата, то он дает мне ERRO:C# делегат класса Возвращаемое значение пусто

NullReferenceException Был Unhandled, Ссылка на объект не указывает на экземпляр объекта/

код:

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; 
    } 

мой почтовый Making Class :

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

Там не достаточно информации здесь, чтобы ответить на вопрос правильно. Вы говорите, что если вы просто выполняете Makezipfile (...) без потока, вы получаете ожидаемый результат? –

+0

@ Chris, Shain: да точно, если я вызову метод без использования потока, это будет нормально, но когда я использую его в потоке, он повторяет вышеупомянутую ошибку упоминания :( – safi

ответ

3

Это не будет делать именно то, что вы хотите, в любом случае.

Путем того, чтобы вставить это в отдельную нить, скорее всего, вы (вероятно, всегда) вернете string.Empty в результате этого метода.

Причина этого в том, что ваша линия return paths; вернется задолго до того, как Makezipfile может успешно выполнить.

Если вы хотите, чтобы это был асинхронный метод, вам необходимо переработать его как асинхронный метод. Существует множество опций, включая модели APM и EAP для асинхронности в .NET 3.5 и более ранних версиях. В .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; 
+0

@ Reed Copsey: что лучше в в этом случае APM или EAP более просты в реализации и меньше Buggie :) thansk – safi

+0

@safi: Если вы используете .NET 4, используйте 'Task '. В .NET <= 3.5 EAP легче разрабатывать в большинстве случаев. –

+0

@ Рид Копси: Я добавил свой Zip-метод и с кодом, вы можете видеть это, можете ли вы дать мне еще несколько подсказок :) – safi

Смежные вопросы