c#如何在此设置中实现后台?

c#如何在此设置中实现后台?,c#,serial-port,backgroundworker,C#,Serial Port,Backgroundworker,我有一个漂亮的C#程序,但是处理串行接收的字节太慢了。我想我也许可以用一个后台工作人员来解决这个问题,但我没有这方面的经验,我以前的所有尝试都失败了 private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e) { rxBuffer += serial.ReadExisting(); // add new bytes to the string 'rxBuffe

我有一个漂亮的C#程序,但是处理串行接收的字节太慢了。我想我也许可以用一个后台工作人员来解决这个问题,但我没有这方面的经验,我以前的所有尝试都失败了

private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            rxBuffer += serial.ReadExisting(); // add new bytes to the string 'rxBuffer'

            this.Invoke(new EventHandler(serialReceived));
        }

        private void serialReceived(object s, EventArgs e)
        {
            while (rxBuffer.Length > 0) // keep processing bytes until the string is empty
            {
                // textBox1.Text += rxBuffer[0];
                byte b = Convert.ToByte(rxBuffer[0]);
                string hexValue = b.ToString("X");

                rxBuffer = rxBuffer.Remove(0, 1); // removes the 'captured' byte from the string
                ..... 
                lots of code
这个while循环基本上占了我整个程序的75%。输入字节
控制UI元素,它们可以存储或读取文本文件,并通过串行端口将字节发送回,它可以做任何事情

这个系统可以工作,但速度太慢了。所以我认为在后台工作程序中移动while循环可以解决这个问题

如何在当前代码设置中实现后台工作程序?到目前为止,我所有的尝试都失败了

编辑: 我想补充一些我刚才在下面评论的东西。我以为会用每个字节调用接收到的
serial_DataReceived
。在我的应用程序中,在接下来的2个接收字节之间碰巧有2毫秒的延迟
ReadExisting()
有时返回的字节数超过1个。因此,串行事件中存在某种延迟。我在Qt中也遇到过这种情况,但这从来都不是问题,我认为它是一种功能,可以同时接收整个字符串


我个人认为,
invoke()
会让一切变得缓慢,但我之前没有使用C语言的经验,所以我只是猜测,无论如何,我对任何解决方案都持开放态度。

这段代码似乎就是解决方案。我注意到我的GUI运行得非常平滑

private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        rxBuffer += serial.ReadExisting();

        try { backgroundWorker1.RunWorkerAsync(); } catch { }
    }


    private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        //private void serialReceived(object s, EventArgs e)
        //{
        while (rxBuffer.Length > 0)
        {
            // textBox1.Text += rxBuffer[0];
            byte b = Convert.ToByte(rxBuffer[0]);
            string hexValue = b.ToString("X");

            rxBuffer = rxBuffer.Remove(0, 1);
我尝试使用isBusy()标志,但它不起作用,所以我改用try和catch块

接收到的串行_数据一直在向字符串rxBuffer添加新字节,backgroundworker确保处理rxString的每个字节

编辑:
我有一个问题,除了一个面板,我无法控制我的UI元素。我刚发现。当我还在另一个线程中时,我试图访问UI元素。

我经常看到这个问题,人们通过串行端口发送和接收命令。我这里有一个很好的例子,它讲述了如何使用后台工作程序和状态机来实现计算机/设备之间的异步串行通信。当您将在一个单独的线程上接收数据时,您需要调用更新UI线程。

下面是一个链接,告诉您如何使用后台工作程序;使用
ReadExisting
的原因是什么?特别是如果你真的对字节感兴趣的话?=!将直接将字节读入缓冲区。看起来整个字符串处理实际上是一个缓慢的过程,如果你把它放在后台,它不会更快。由于您已经实现了
serial\u DataReceived
事件,因此您的进程已经在后台线程上。您在
大量代码
中要做什么,从而需要调用
Invoke
?这个调用可能使它变得如此缓慢(我以前关于字符串处理的假设是错误的)@MongZhu据我所知,“serial_DataReceived”事件是用每个接收到的字节调用的。但情况并非完全如此,因为ReadExisting()通常返回超过1个字节。使用ReadExisting,我使用+=运算符将所有新数据添加到缓冲区字符串中。字符串是缓冲区。@MongZhu我在OP中解释了大量代码中发生的事情。UI元素是受控的(文本被放置在屏幕上),我向文本文件写入和从文本文件写入。我还通过串行端口将字节发送回机器。我需要调用来防止与线程相关的崩溃。我不能直接从引发串行事件的线程修改UI元素