Вы блокируете поток пользовательского интерфейса во время вашего долгого запущенного процесса, как предотвращение UI от обновления текстового значения, или приема входных данных пользователя, или делать что-либо по этому вопросу.
Вам необходимо выполнить длительную работу асинхронно, чтобы не блокировать поток пользовательского интерфейса.
В идеале у вас будет асинхронный метод, предоставляемый вашим FtpClient
(и даже лучше, он вернет Task
). Это позволит вам написать примерно следующее:
private async void button1_Click(object sender, EventArgs e)
{
status.Text = "In Progress";
if (listBox1.Items.Count == 0)
{
MessageBox.Show("Please select a file to upload");
}
FtpClient client = new FtpClient("*******", "*******", "******");
string fileName = getFileNameFromPath(listBox1.Items[0].ToString());
string localFile = listBox1.Items[0].ToString();
string remoteFile = "**********/" + fileName;
string link = await client.uploadAsync(remoteFile, localFile);
listBox1.Items.RemoveAt(0);
textBox1.Text = link;
status.Text = "Ready";
}
И тогда все будет готово. Если это не дает никаких асинхронных методов то, как работа вокруг, вы можете просто начать новую задачу, чтобы сделать работу в фоновом режиме:
private async void button1_Click(object sender, EventArgs e)
{
status.Text = "In Progress";
if (listBox1.Items.Count == 0)
{
MessageBox.Show("Please select a file to upload");
}
FtpClient client = new FtpClient("*******", "*******", "******");
string fileName = getFileNameFromPath(listBox1.Items[0].ToString());
string localFile = listBox1.Items[0].ToString();
string remoteFile = "**********/" + fileName;
string link = await Task.Run(() => client.upload(remoteFile, localFile));
listBox1.Items.RemoveAt(0);
textBox1.Text = link;
status.Text = "Ready";
}
Если вы не имеете C# 5.0 и .NET 4,5, чтобы иметь возможность использовать await
, то вы можете использовать BackgroundWorker
:
private void button1_Click(object sender, EventArgs e)
{
status.Text = "In Progress";
if (listBox1.Items.Count == 0)
{
MessageBox.Show("Please select a file to upload");
}
string fileName = getFileNameFromPath(listBox1.Items[0].ToString());
string localFile = listBox1.Items[0].ToString();
string remoteFile = "**********/" + fileName;
var worker = new BackgroundWorker();
worker.DoWork += (s, args) =>
{
FtpClient client = new FtpClient("*******", "*******", "******");
args.Result = client.upload(remoteFile, localFile);
};
worker.RunWorkerCompleted += (s, args) =>
{
listBox1.Items.RemoveAt(0);
textBox1.Text = args.Result as string;
status.Text = "Ready";
};
worker.RunWorkerAsync();
}
вызовов Application.DoEvents только после того, как вы установите status.text. – rheitzman