- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我运行我的代码时,我总是得到后台工作人员很忙。有帮助吗?
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/
根据https://developers.google.com/google-apps/calendar/v3/reference/freebusy/query处的文档要执行空闲/忙碌查询,您必须在正
我在启动 Apache 后使用 XAMPP 1.7.7 我收到此警报: Busy... Apache started [Port 80] 我已经打开了 httpd.conf 文件,并将端口号更改为 8
我有端口问题。 每当我启动 Apache 时,它都会给我这个错误: Busy - Apache Started [port 80] 当我启动 Mysql 时出现以下错误: Busy - ERROR
当我运行我的代码时,我总是得到后台工作人员很忙。有帮助吗? struct FtpSetting { public string Server { get; set
在我们的 Android 和 iOS MVVMCross 应用程序中,我们偶尔会遇到 SQLiteException: busy 异常。 给定下面的代码,我们有几个存储库,每个存储库都构造一个下面的实
每次运行解决方案(20 projs)时,我都会收到此错误。我尝试禁用 UI 选项、resharper、删除未使用的扩展等,但仍然无法通过此错误。 我使用的是 VS 2015 Update 2 Ente
我正在使用这个插件 https://github.com/mozilla/rust-android-gradle ,这需要我添加 tasks.whenTaskAdded { task -> i
我是一名优秀的程序员,十分优秀!