C# 在不阻塞接收器的情况下解码线程中的连续数据流

C# 在不阻塞接收器的情况下解码线程中的连续数据流,c#,multithreading,ftdi,C#,Multithreading,Ftdi,我在我的项目中使用UART到USB通信,FTDI芯片 我从UART接收到连续的数据流。我想对接收到的数据进行解码。我已经为从FTDI芯片接收到的字符启用了事件处理程序。因此,每当我接收到任何数据时,它都会到达这个单独的线程 //Event Wait Handle private EventWaitHandle DataReceived = new EventWaitHandle(false, EventResetMode.AutoReset); 我利用一个背景工作者 BackgroundWor

我在我的项目中使用UART到USB通信,FTDI芯片

我从UART接收到连续的数据流。我想对接收到的数据进行解码。我已经为从FTDI芯片接收到的字符启用了事件处理程序。因此,每当我接收到任何数据时,它都会到达这个单独的线程

//Event Wait Handle
private EventWaitHandle DataReceived = new EventWaitHandle(false, EventResetMode.AutoReset);
我利用一个背景工作者

BackgroundWorker DataHandler = new BackgroundWorker();
DataHandler.DoWork += new DoWorkEventHandler(DataHandler_DoWork);
启动单独的线程进行读取

if (!DataHandler.IsBusy)
    DataHandler.RunWorkerAsync();
我注意到DecodeData功能在解码接收到的数据时会阻止数据的接收。有什么方法可以完成此任务吗

以下是函数:

void DataHandler_DoWork(object sender, DoWorkEventArgs e)
{
    UInt32 numBytes = 0;
    byte[] readArray = new byte[1025];
    // Loop forever
    for (; ; )
    {
        // Wait for a FT_EVENT_RXCHAR event
        if (DataReceived.WaitOne(100))
        {
            // Find out how many bytes have been received
            if ((ftStatus = _ftdiHelper.GetDataBytes(this, ref numBytes)) != FTDI.FT_STATUS.FT_OK)
            {
                continue;
            }
            // Read the bytes out
            if ((ftStatus = _ftdiHelper.ReadFromFTDI(readArray, numBytes, ref numBytes)) != FTDI.FT_STATUS.FT_OK)
            {
                continue;
            }
            _decodeResponse.DecodeData(this, readArray);
            Array.Clear(readArray, 0, readArray.Length);
        }

        if (DataHandler.CancellationPending)
            break;
    }
}

您需要另一个线程—一个线程读取,另一个线程处理。我如何将数据(在我的例子中是ReadArray)传递给该线程?例如,您可以使用并发队列。是否有相关的示例代码?用于创建单独的线程并在每次接收数据字节时传递ReadArray?你能在这里发布链接吗?这是一个典型的“生产者-消费者”用例。为消费者和生产者以及
阻止集合
添加
获取消费者的真实性()方法使用不同的线程。详情请阅读。