如何在不冻结 GUI 的情况下使用 C# (WPF) 中的串行端口发送大文本?

How To Send a Large text with serial Port in C# (WPF) , without freezing GUI?

我想通过串口发送一个大的文本文件。 我使用 "Dispatcher.BeginInvoke" 和钢 ui 冻结直到文件发送

    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;
            }
        }
    }

我该怎么办? 谢谢

您可以使用 async/await.

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

此代码有效!

    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;
                }
            }
        }
    }