C # Фоновая проблема параметра рабочего? - PullRequest
2 голосов
/ 10 февраля 2011

Я вызываю этот класс zip_threading в другом классе. string a = zip_threading (?,?), но проблема в том, как я могу передать значения параметров при вызове этого класса: String [] files, bool IsOriginal. я использовал в этом классе фоновую рабочую многопоточность, поэтому реальная проблема заключается в том, что передача значения этому классу и возвращение значения по окончании обработки в классе make_zip_file.

public class zip_threading

{

public string[] files { get; set; } // to be recieved by the zip method as zip file names.
public int number;
public string return_path;
public bool IsOriginal { get; set; }  // to be recieved by the zip method as boolean true or fales
public static BackgroundWorker bgw1 = new BackgroundWorker(); // make a background worker object.
public void bgw1_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
{

    make_zip_file mzf1 = e.Result as make_zip_file;
    return_path = mzf1.return_path;

}
public make_zip_file bgw_DoWork(string[] files, bool IsOriginal, make_zip_file argumentest)
{

    Thread.Sleep(100);
    argumentest.return_path = argumentest.Makezipfile(files,IsOriginal);
    return argumentest;

}
public void run_async(string []files,bool IsOriginal)
{

    make_zip_file mzf2 = new make_zip_file();
   // mzf2.files = files;
    //mzf2.IsOriginal = IsOriginal;

    bgw1.DoWork += (sender, e) => e.Result = bgw_DoWork(files, IsOriginal, mzf2);
    bgw1.RunWorkerAsync();

}

public  class make_zip_file
    {

 public string return_path ;
        //public string[] files{get;set;}
       // public bool IsOriginal{get;set;}


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

        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception during processing {0}", ex);

            // No need to rethrow the exception as for our purposes its handled.
        }

        return_path = "images/Thumbnails/zipFiles/" + DirectoryName + ".zip";
return return_path;
}}

Теперь я вызываю этот метод в другом классе: вот так

String path=zipa.run_async(fileCollection, IsOriginal);

Я получаю ошибку в make_Zip_File, и я отмечаю это с помощью: Ссылка на объект не установлена ​​в Экземпляре объекта .ToString (); *

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Перенося это в другой поток, вы запускаете за пределами http-контекста, который вполне может закончиться задолго до того, как ваша операция zip (сносит все, например, буферы входящего потока) - покавы говорите с HttpContext.Current.

У вас есть несколько вариантов;размышляя над головой ...

  • запустить его в потоке запросов;это займет некоторое время, но ме ...
  • буферизирует все данные, которые вам нужны в памяти, и передает их в операцию zip
  • запись файла на диск во временной области (не из основной папки приложения) из потока запроса, затем создайте отдельный поток для его обработки из временной области

, но для повторного выполнения: вы не можете получить доступ к запросу из другого потока - илипо крайней мере, вы не должны.

Кроме того, рассмотрим:

  • запрос начинается
  • вы раскручиваете нить, чтобы выполнить zip
  • вы возвращаетесь из исходного запроса
  • (рабочий поток продолжает работать)

вам нужно подумать о том, что вы собираетесь делать с именем файла zip;Вы не можете просто дать это клиенту - они больше не слушают вас.

0 голосов
/ 10 февраля 2011

Проверьте, что файлы [i] инициализированы или нет, поскольку они откуда-то поступают в функцию

Makezipfile(string[] files, bool IsOriginal)
{

}

Я думаю, что в них не будет никакого значения.

...