gpt4 book ai didi

c# - 我如何修复 backgroundworker 忙 c# 代码

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

当我运行我的代码时,我总是得到后台工作人员很忙。有帮助吗?

       struct FtpSetting
{
public string Server { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string FileName { get; set; }
public string FullName { get; set; }
}

FtpSetting _inputParameter;

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
string fileName = ((FtpSetting)e.Argument).FileName;
string fullName = ((FtpSetting)e.Argument).FullName;
string userName = ((FtpSetting)e.Argument).Username;
string password = ((FtpSetting)e.Argument).Password;
string server = ((FtpSetting)e.Argument).Server;
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(string.Format("{0}/{1}", server, fileName)));
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(userName, password);
Stream ftpStream = request.GetRequestStream();
FileStream fs = File.OpenRead(fullName);
byte[] buffer = new byte[1024];
double total = (double)fs.Length;
int byteRead = 0;
double read = 0;
do
{
if (!backgroundWorker.CancellationPending)
{
//Upload file & update process bar
byteRead = fs.Read(buffer, 0, 1024);
ftpStream.Write(buffer, 0, byteRead);
read += (double)byteRead;
double percentage = read / total * 100;
backgroundWorker.ReportProgress((int)percentage);
}
}
while (byteRead != 0);
fs.Close();
ftpStream.Close();
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lblStatus.Text = $"Uploaded {e.ProgressPercentage} %";
progressBar.Value = e.ProgressPercentage;
progressBar.Update();
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lblStatus.Text = "Upload complete !";
}

private void btnUpload_Click(object sender, EventArgs e)
{
string dir = "C:\\Users\\bluevels\\Pictures\\";
string[] files = Directory.GetFiles(dir);
foreach (string file in files)
{

string FileName = Path.GetFileName(file);

FileInfo fi = new FileInfo(FileName);
_inputParameter.Username = txtUserName.Text;
_inputParameter.Password = txtPassword.Text;
_inputParameter.Server = txtServer.Text;
_inputParameter.FileName = fi.Name;
_inputParameter.FullName = fi.FullName;
backgroundWorker.RunWorkerAsync(_inputParameter);

}
}

private void Form1_Load(object sender, EventArgs e)
{

}

我不断收到这一行的错误

backgroundWorker.RunWorkerAsync(_inputParameter);

最佳答案

通过将 RunWorkerAsync() 放置在 foreach 中,您试图在 worker 已经运行时使用同一个实例启动多个副本。

考虑将循环移动到 worker 本身:

class FtpSetting
{
public string Server { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string[] Files { get; set; }
}

private void btnUpload_Click(object sender, EventArgs e)
{
if (backgroundWorker.IsBusy)
return;

string dir = "C:\\Users\\bluevels\\Pictures\\";
string[] files = Directory.GetFiles(dir);

_inputParameter.Username = txtUserName.Text;
_inputParameter.Password = txtPassword.Text;
_inputParameter.Server = txtServer.Text;
_inputParameter.Files = files;
backgroundWorker.RunWorkerAsync(_inputParameter);
}

自然地,worker 的主体将需要更改,因为 e 现在是一个文件列表。其余属性可以直接从实例字段中读取。

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
var setting = (FtpSetting)e.Argument;
...
for (int fileNum = 0; fileNum < setting.Files.Length; fileNum++)
{
if (backgroundWorker.CancellationPending)
break;

do
...
// use setings.Files[fileNum]
// also divide percentage done by setting.Files.Length e.g.
double percentage = (100/setting.Files.Length)+fileNum + (read / total * 100);
...
}

}

这样一来,如果您决定从多个站点进行真正的并发下载(您将需要多个工作人员或可能考虑TPL DataFlow),代码更改将最少。

关于c# - 我如何修复 backgroundworker 忙 c# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56283618/

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