2013-10-10 4 views
0

У меня есть ситуация, когда мне нужна только метка, которая переключается между «Готов» и «Выполняется», когда пользователь нажимает кнопку. Метка встроена в состояние «Готов». Когда пользователь нажимает кнопку, метка должна читать «Выполняется», тогда необходимо выполнить некоторые задачи, такие как копирование файлов и т. Д. После того, как задачи будут успешно завершены, ярлык должен снова прочитать «Готово». Сейчас я использую этот фрагмент кода, и статус метки не изменяется. Как я могу сделать эту работу. Пожалуйста помоги.Использование метки для отображения состояния формы

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"); 
     } 
     FtpClient client = new FtpClient("*******", "*******", "******"); 
     string fileName = getFileNameFromPath(listBox1.Items[0].ToString()); 
     string localFile = listBox1.Items[0].ToString(); 
     string remoteFile = "**********/"+fileName; 
     string link = client.upload(remoteFile, localFile); 
     listBox1.Items.RemoveAt(0); 
     textBox1.Text = link; 
     status.Text = "Ready"; 
    } 
+0

вызовов Application.DoEvents только после того, как вы установите status.text. – rheitzman

ответ

2

Вы блокируете поток пользовательского интерфейса во время вашего долгого запущенного процесса, как предотвращение 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(); 
} 
+0

Я получаю несколько ошибок компиляции, когда я пробовал этот второй подход, похоже, не согласен использовать «ожидание» и не позволяет использовать async в моей сигнатуре метода. – Sai

+0

@Sai Для этого конкретного решения требуется наличие C# 5.0 и .NET 4.5. Если вы этого не сделаете, и ваш FTP-клиент не имеет встроенной асинхронной поддержки, вам нужно будет использовать «BackgroundWorker». Загрузите файл в обработчик DoWork и обновите текстовое поле в обработчике события RunWorkerCompleted. – Servy

+0

Большое спасибо. Моя проблема в том, что я не знаю, как передать управление с одного нажатия кнопки на работу рабочего. здесь процесс загрузки начинается после того, как пользователь нажимает кнопку, как я могу вызвать работу в обработчике событий нажатия кнопки? – Sai

Смежные вопросы