gpt4 book ai didi

c# - 线程问题

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

我正在 ftp 中做一个项目,它将进行多次上传,我正在做的过程是压缩文件然后加密然后切成几 block 并将其发送到服务器我将所有这些东西分配给一个线程。同样我分配的每个文件都会有一个线程。

这是新的一段代码,它只有一个功能,同样的错误出现在这里也请帮我找出这里出了什么问题

public partial class Form1 : Form 

{ ArrayList AscendingList = new ArrayList(); ListViewItem Litem = null; 线程 MyThread = null; ThreadStart 启动器 = null;

public Form1() 
{
InitializeComponent();
}

private void btn_split_Click(object sender, EventArgs e)
{
foreach (ListViewItem litem in listView1.Items)
{
Starter = delegate { SplitFile(litem.Text,litem.SubItems[1].Text,int.Parse(litem.SubItems[2].Text)); };
MyThread = new Thread(Starter);
MyThread.IsBackground = true;
MyThread.Start();
}
}
public void SplitFile(string inputFile, string outputPrefix, int chunkSize)
{
int pointr = 0;
byte[] buffer = new byte[chunkSize];

using (FileStream fs = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.None))
{
int index = 0;
pointr = fs.Read(buffer, 0, buffer.Length);
while (pointr != 0)
{
using (FileStream fso = new FileStream(outputPrefix + "\\" + index + ".log", FileMode.Create))
{
AscendingList.Add(fso.Name);
fso.Write(buffer, 0, pointr);
pointr = fs.Read(buffer, 0, buffer.Length);
}
index++;
}
}
}

private void button1_Click(object sender, EventArgs e)
{
Litem = new ListViewItem();
Litem.Text = "E:\\butterfly.mpg";
Litem.SubItems.Add("H:\\karthik");
Litem.SubItems.Add("102400");
listView1.Items.Add(Litem);
}

private void button2_Click(object sender, EventArgs e)
{
Litem = new ListViewItem();
Litem.Text = "E:\\karthik.mpeg";
Litem.SubItems.Add("H:\\karthik\\karthik");
Litem.SubItems.Add("102400");
listView1.Items.Add(Litem);
}

}

最佳答案

这段代码很乱;您可能应该尝试清理它。在此过程中,您可能会发现您的错误已自行修复。

  • 您有几个空的 catch 子句,这是一个大危险信号(注释掉的 using block 是一个更好的主意)。这些应该全部被删除;这些不太可能是个好主意。
  • 您有一个 thread.Sleep 语句,它可能是多余的 - 如果不是,那就是线程错误的迹象。
  • 您应该将基本功能分解为辅助方法。这增加了代码的可读性和可调试性 - 并自动以私有(private)帮助方法名称的形式提供一些文档。例如,您从 A 读取到 B 的代码可以是一种方法 - 您已经在 SplitFileDecompress 中复制了此功能。
  • 您有一堆错误的 .Read( 语句假设 read 实际上读取了整个缓冲区 - 它没有,它等待至少 1 个字节可用并且只返回立即可用的内容,或者如果流完成则返回 0。您应该永远忽略 .Read( 方法返回的字节数。如果您拆分(更好的)while- SplitFileDecompress 中的基于代码的辅助方法,您也可以在其他地方使用它。这很可能在写入网络或物理驱动器时引起问题.
  • 可以编写多个 using block 而无需额外的花括号以提高可读性。如果这样做,VS.NET 不会为每个 using() 子句添加缩进级别,而只会为所有子句添加一个缩进级别。
  • 我不太清楚,但看起来您正在处理一堆中间文件。一种更简洁(并且可能更快)的方法是简单地处理流并使用恰好提供文件流的包装器。
  • 您不需要在 .Close() 之前执行 .Flush()
  • 将真正每个 IDisposable 放在using block 中是一个好习惯。甚至像 MemoryStreamCryptoStream 这样的东西 - 这可能无关紧要,但我看到你正在 .Close() - 无论如何(所以您没有保存任何代码),并且您违反了代码契约(Contract)并且您可能不知道它们的实现,因此您依赖于未指定的行为;那不值得。
  • .Substring(....).ToString() 等同于 .Substring()

基本上,看起来您正在使用您不太熟悉的技术制作一件大而复杂的东西;尝试将其拆分成小而干净的部分,让您可以更精确地确定您需要什么 - 这样您就可以更好地保持对任何新技术的控制。

首先清理你所拥有的;然后尝试查明您剩下的任何错误 - 如果您有点幸运,您将不会有任何...

希望对您有所帮助!

关于c# - 线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1671866/

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