【发布时间】:2015-03-18 16:19:36
【问题描述】:
我正在通过正常工作的串行端口读取数据。以下是我的简短代码
public Form1()
{
InitializeComponent();
//Background worker
m_oWorker = new BackgroundWorker();
m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);
m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged);
m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted);
m_oWorker.WorkerReportsProgress = true;
m_oWorker.WorkerSupportsCancellation = true;
connectComPort.DataReceived += new SerialDataReceivedEventHandler(receiveData);
enableDisable();
}
void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
{
backProcess();
m_oWorker.ReportProgress(100);
}
private void backProcess()
{
//do some work
Thread.Sleep(10000);
if(check if 2000 bytes received)
{
//do some work
}
}
backProcess() 在后台工作程序上运行,我有一个全局队列,我在其中插入从串行端口接收到的字节,并在 if 循环中检查此队列。
我的问题是,当从另一端向 pc 发送 2000 个字节时,我收到少于 1000 个字节,直到在 thread.sleep 语句之后,但是如果我在 thread.sleep 步骤设置断点,我收到完整的 2000 个字节。那么 thread.sleep(background thread) 也会阻塞数据接收事件处理程序吗?我怎样才能避免这个问题?
【问题讨论】:
-
看不到
backProcess与后台工作人员m_oWorker有什么关系; -
您只是通过使用调试器中断来增加睡眠。当调试器中断处于活动状态时,驱动程序会继续接收数据。整个方法存在严重缺陷,让您的 DataReceived 事件处理程序在接收到 2000 个字节后处理数据,没有必要让线程等待它发生。
标签: c# multithreading serial-port