c # Делегат Класс Возвращаемое значение пусто - PullRequest
0 голосов
/ 08 февраля 2011

У меня есть следующий код, но проблема в том, что когда я выполняю его без использования потока делегата, он проходит гладко, но когда я использую делегат, тогда это дает мне ошибку:

Необработанное исключение 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;
*

} * 1013

1 Ответ

3 голосов
/ 08 февраля 2011

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

Попытка вставить это в отдельный поток, скорее всего, вы (вероятно, всегда) вернете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...