2016-05-16 6 views
0

Я хочу отправить большой текстовый файл через последовательный порт. я использую «Dispatcher.BeginInvoke» и стали пользовательский интерфейс замораживания до файла не отправляетсяКак отправить большой текст с последовательным портом в C# (WPF), без зависания GUI?

public delegate void SendFileDelegate(string _fileText); 
... 
    private void buttonTxSend_Click(object sender, RoutedEventArgs e) 
    { 
     this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new SendFileDelegate(SendFile), textBoxTx.Text); 
    } 

    private void SendFile(string _fileText) 
    { 
     var _fileLenght = _fileText.Length; 
     progressBarTx.Maximum = _fileLenght - 1; 
     for (int i = 0; i < _fileLenght; i++) 
     { 
      progressBarTx.Value = i; 
      string _character = textBoxTx.Text[i].ToString(); 
      try 
      { 
       _comPort.Write(_character); 
      } 
      catch (Exception _ex) 
      { 
       Message.Error("Error Write Data: " + _ex.ToString()); 
       break; 
      } 
     } 
    } 

что я должен делать? спасибо

ответ

0

этот код работа!

private async void buttonTxSend_Click(object sender, RoutedEventArgs e) 
    { 
     buttonTxSend.IsEnabled = false; 
     string _fileText = textBoxTx.Text; 

     var _sendTask = Task.Factory.StartNew(() => SendFile(_fileText)); 
     await _sendTask; 
     buttonTxSend.IsEnabled = true; 
    } 

    private void SendFile(string _fileText) 
    { 
     var _fileLenght = _fileText.Length; 
     this.Dispatcher.Invoke(() => { progressBarTx.Maximum = _fileLenght - 1; }); 
     this.Dispatcher.Invoke(() => { progressBarTx.Value = 0; }); 
     for (int i = 0; i < _fileLenght; i++) 
     { 
      this.Dispatcher.Invoke(() => { progressBarTx.Value = i; }); 
      string _character = _fileText[i].ToString(); 
      if (_lfTxFlag || _character != "\n") 
      { 
       try 
       { 
        _comPort.Write(_character); 
        Console.WriteLine(_character); 
       } 
       catch (Exception _ex) 
       { 
        Message.Error("Error Write Data: " + _ex.ToString()); 
        StatusRed("Error"); 
        break; 
       } 
      } 
     } 
    } 
1

Вы можете использовать async/wait.

private async void buttonTxSend_Click(object sender, RoutedEventArgs e) 
{ 
    await Task.Run(() => 
    { 
     this.Dispatcher.Invoke(() => 
     { 
      SendFile(textBoxTx.Text); 
     }); 
    }); 
} 
+0

Благодарим вас, что ответили, но замораживают стальной UI. –