private void ReadCanBusThread() { byte[] Msg; TBaseModule Module; uint ID = 0; string Loginfo; while (!cancelTokenSource2.IsCancellationRequested) { Thread.Sleep(1); //从总线上读取数据,需要并发处理 if (_CanObj.ReadCanMsg(ref ID, out Msg)) { //Todo 使用异步委托执行,在新的线程中执行 //但线程不停的创建并释放耗时 //思考:如果把数据处理部分放到线程池中处理,效率是否能够提升? lock (lockHelper) { _ModuleList.TryGetValue(ID, out Module); if (Module != null) { //如果其它线程也在操作该模块对象,如读取该模块的属性值,而本线程正在执行DoMsg, //该如何同步该模块? //这是个虚方法,如果被子类覆盖则调用子类的实现 //这个方法中不能有同步到主线程处理的动作,不然会阻塞CAN总线的读写 Module.DoMsg(Msg); //Module.AddMsgToQueue(ID, Msg); //数据压入每个模块自己的处理队列中 #if DEBUG Loginfo = "Rece:" + GetInfoMsg(ID, Msg); LogHelper.WriteLog(Loginfo); #endif } } } } }