C#中实现跨线程写入的示例代码
方案核心思路写入请求队列使用ConcurrentQueue接收来自任意线程的写入请求。专用写入线程由独立线程处理队列中的写入操作确保顺序执行。双信号机制通过ManualResetEventSlim控制读取线程的暂停与恢复。线程安全确认确保多个线程同时触发写入时不会导致竞态条件。完整代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128usingSystem;usingSystem.Collections.Concurrent;usingSystem.Threading;publicclassCrossThreadReadWriteController{// 控制读取线程暂停和恢复的信号privatereadonlyManualResetEventSlim _pauseRequest newManualResetEventSlim(false);// 读取线程确认已暂停的信号privatereadonlyManualResetEventSlim _pausedConfirmed newManualResetEventSlim(false);// 写入请求队列线程安全privatereadonlyConcurrentQueueAction _writeQueue newConcurrentQueueAction();// 停止标志privatevolatilebool_stopRequested false;// 写入专用线程privateThread _writeThread;publicCrossThreadReadWriteController(){// 启动写入专用线程_writeThread newThread(ProcessWriteQueue);_writeThread.Start();}// 读取线程的循环任务publicvoidReadLoop(){while(!_stopRequested){// 检查是否需要暂停if(_pauseRequest.IsSet){// 确认已暂停并等待恢复信号_pausedConfirmed.Set();_pauseRequest.Wait();_pausedConfirmed.Reset();}// 模拟读取操作Console.WriteLine($[Read] {DateTime.Now:HH:mm:ss.fff} - Reading data...);Thread.Sleep(1000);// 模拟耗时操作}Console.WriteLine([Read] Thread stopped.);}// 处理写入队列的专用线程privatevoidProcessWriteQueue(){while(!_stopRequested || !_writeQueue.IsEmpty){if(_writeQueue.TryDequeue(outvar writeAction)){// 触发暂停读取线程RequestPause();// 执行写入操作writeAction.Invoke();// 恢复读取线程ResumeRead();}else{Thread.Sleep(50);// 队列为空时短暂休眠}}Console.WriteLine([Write] Thread stopped.);}// 跨线程提交写入请求publicvoidSubmitWriteCommand(Action writeAction){_writeQueue.Enqueue(writeAction);}// 请求暂停读取线程线程安全privatevoidRequestPause(){_pauseRequest.Set();_pausedConfirmed.Wait();// 等待读取线程确认暂停}// 恢复读取线程线程安全privatevoidResumeRead(){_pauseRequest.Reset();}// 停止所有线程publicvoidStop(){_stopRequested true;_pauseRequest.Set();// 确保读取线程退出等待_writeThread.Join();// 等待写入线程结束}}// 使用示例publicclassProgram{publicstaticvoidMain(){var controller newCrossThreadReadWriteController();// 启动读取线程var readThread newThread(controller.ReadLoop);readThread.Start();// 模拟多个线程触发写入操作for(inti 0; i 3; i){var threadId i;newThread(() {controller.SubmitWriteCommand(() {Console.WriteLine($[Write-{threadId}] {DateTime.Now:HH:mm:ss.fff} - Writing data...);Thread.Sleep(500);// 模拟耗时操作});}).Start();}Thread.Sleep(5000);// 等待所有写入完成controller.Stop();readThread.Join();Console.WriteLine(Main thread exited.);}}关键改进解析1.跨线程写入请求的提交通过SubmitWriteCommand方法任何线程均可提交写入操作1234publicvoidSubmitWriteCommand(Action writeAction){_writeQueue.Enqueue(writeAction);// 线程安全入队}2.专用写入线程处理队列写入操作由独立线程顺序处理避免多线程并发写入冲突123456789101112privatevoidProcessWriteQueue(){while(!_stopRequested || !_writeQueue.IsEmpty){if(_writeQueue.TryDequeue(outvar writeAction)){RequestPause();// 暂停读取线程writeAction();// 执行写入ResumeRead();// 恢复读取线程}}}3.双重信号确保原子性通过RequestPause和ResumeRead方法封装暂停与恢复逻辑12345privatevoidRequestPause(){_pauseRequest.Set();// 发送暂停信号_pausedConfirmed.Wait();// 阻塞等待读取线程确认暂停}4.线程安全停止机制通过_stopRequested标志和队列检查确保安全退出12345publicvoidStop(){_stopRequested true;_writeThread.Join();// 等待写入线程处理完队列}运行效果[Read] 14:30:01.123 - Reading data...[Read] 14:30:02.124 - Reading data...[Write-0] 14:30:03.125 - Writing data...[Read] 14:30:03.626 - Reading data...[Write-1] 14:30:04.127 - Writing data...[Read] 14:30:04.628 - Reading data...[Write-2] 14:30:05.129 - Writing data...Main thread exited.方案优势特性说明多线程安全通过 ConcurrentQueue 和信号量支持任意线程触发写入操作。顺序执行写入操作由专用线程顺序处理避免并发冲突。无锁读取读取线程在非写入状态下完全无锁最大化性能。精准控制通过双信号机制确保写入操作执行期间读取线程完全暂停。适用场景分布式任务调度多个工作线程提交写入请求由中心线程处理。实时数据采集采集线程持续读取数据外部线程动态更新配置。高并发服务如网络服务器处理来自不同客户端的并发更新操作。