gpt4 book ai didi

C#后台worker参数问题?

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:25 26 4
gpt4 key购买 nike

我在另一个类中调用这个 zip_threading 类。 string a = zip_threading(?,?) 但问题是当我调用此类时如何传递参数值:String [] 文件,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 中遇到错误,我将其标记为:未将对象引用设置为对象的实例* filenames[i] = HttpContext.Current.Request.PhysicalApplicationPath + files[i].Remove(0, 10) .ToString();*

最佳答案

通过将其带到不同的线程,您正在 http 上下文的外部 运行,这很可能在您的 zip 操作执行之前很久就完成了(拆除所有东西,如入站流缓冲区)-但是您正在与 HttpContext.Current 通话。

您有几个选择;想出我的头顶......

  • 在请求线程上运行它;这需要一段时间,但是嗯...
  • 将您需要的所有数据缓存在内存中,并将其传递给 zip 操作
  • 从请求线程将文件写入临时区域(不是主应用程序文件夹)的磁盘,然后生成一个单独的线程从临时区域处理它

但要重申:您不能从另一个线程访问请求 - 或者至少,您不应该。

另外,考虑:

  • 请求开始
  • 你启动一个线程来压缩
  • 你从最初的请求中返回
  • (工作线程继续运行)

您需要考虑要对 zip 文件名做什么;你不能只把它交给客户——他们不再听你的了。

关于C#后台worker参数问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com