C#管道通訊及傳輸信息丟失的原因

以下是C#管道通訊客戶端/服務端共用類

namespace PipeCommunication
{
? ? /// <summary>
? ? /// 管道信息回調通知
? ? /// </summary>
? ? /// <param name="msg"></param>
? ? public delegate void PipeMessageEventHandler(string msg);

? ? public class PipeCommunicateCenter
? ? {
? ? ? ? public event PipeMessageEventHandler OnPipeMessageReceiveEvent;

? ? ? ? private string _pipeServerName = "";
? ? ? ? private string _pipeClientName = "";

? ? ? ? public PipeCommunicateCenter(string pipeServerName, string pipeClientName)
? ? ? ? {
? ? ? ? ? ? _pipeServerName = pipeServerName;
? ? ? ? ? ? _pipeClientName = pipeClientName;
? ? ? ? }

? ? ? ? /// <summary>
? ? ? ? /// 發送消息
? ? ? ? /// </summary>
? ? ? ? /// <param name="msg"></param>
? ? ? ? public void ClientSend(string msg)
? ? ? ? {
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", _pipeClientName, PipeDirection.InOut))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? pipeClient.Connect(3000);

? ? ? ? ? ? ? ? ? ? using (StreamWriter sw = new StreamWriter(pipeClient))
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? sw.AutoFlush = true;
? ? ? ? ? ? ? ? ? ? ? ? sw.WriteLine(msg);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? {

? ? ? ? ? ? }
? ? ? ? }

? ? ? ? Thread thPipLsiten;
? ? ? ? /// <summary>
? ? ? ? /// 啟動監聽
? ? ? ? /// </summary>
? ? ? ? public void StartPipListen()
? ? ? ? {
? ? ? ? ? ? thPipLsiten = new Thread(PipListen);
? ? ? ? ? ? thPipLsiten.IsBackground = true;
? ? ? ? ? ? thPipLsiten.Start();
? ? ? ? }

? ? ? ? /// <summary>
? ? ? ? /// 監聽線程是否存在
? ? ? ? /// </summary>
? ? ? ? /// <returns></returns>
? ? ? ? public bool GetPipListenIsAlive()
? ? ? ? {
? ? ? ? ? ? return thPipLsiten == null ? false : thPipLsiten.IsAlive;
? ? ? ? }

? ? ? ? bool hasRead = false;
? ? ? ? /// <summary>
? ? ? ? /// 監聽線程
? ? ? ? /// </summary>
? ? ? ? private void PipListen()
? ? ? ? {
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? while (!isExist)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? using (NamedPipeServerStream pipeServer = new NamedPipeServerStream(_pipeServerName, PipeDirection.InOut))
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? pipeServer.WaitForConnection();//等待連接,程序會阻塞在此處,直到有一個連接到達
? ? ? ? ? ? ? ? ? ? ? ? hasRead = false;
? ? ? ? ? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? while (!hasRead)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? using (StreamReader sr = new StreamReader(pipeServer))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? var read = sr.ReadLine();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (!string.IsNullOrEmpty(read))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hasRead = true;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //MessageBox.Show("pipread:" + read);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NotifyPipeMessageReceive(read);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Thread.Sleep(10);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? catch (Exception ex2)
? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? Thread.Sleep(10);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex1)
? ? ? ? ? ? {

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? /// <summary>
? ? ? ? /// 通知收到信息
? ? ? ? /// </summary>
? ? ? ? /// <param name="msg"></param>
? ? ? ? private void NotifyPipeMessageReceive(string msg)
? ? ? ? {
? ? ? ? ? ? OnPipeMessageReceiveEvent?.Invoke(msg);
? ? ? ? }

? ? ? ? bool isExist = false;
? ? ? ? /// <summary>
? ? ? ? /// 退出監聽管道
? ? ? ? /// </summary>
? ? ? ? public void ExistPipeCommunicate()
? ? ? ? {
? ? ? ? ? ? isExist = true;
? ? ? ? }
? ? }
}

使用條件:

客戶端/服務端通訊均在線程中使用

問題:

在使用過程中偶爾發生通訊丟失,程式假死,程式邏輯無法正常走下去.

原因分析:

因為程式中異步線程使用了Application.DoEvents()方法.

在C# WinForms中,Application.DoEvents()?方法的作用是強制處理當前消息隊列中的所有Windows消息,例如用戶輸入(點擊、鍵盤事件)、界面重繪等。它的主要意義是讓應用程序在長時間運行的代碼中保持界面響應,但需謹慎使用。

當執行耗時操作(如循環、復雜計算或阻塞任務)時,UI線程會被占用,導致界面“卡死”(無法響應用戶操作或更新顯示)。調用?Application.DoEvents()?會臨時處理消息隊列中的事件,讓界面保持“假響應”。

解決方案:

在非UI線程中禁止使用?Application.DoEvents()

異步線程強制使用?Application.DoEvents()可能會導致事件處理順序混亂,界面更新異常,邏輯依賴破壞等問題.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80539.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MixTeX - 支持CPU推理的多模態LaTeX OCR

文章目錄 一、項目概覽相關資源核心特性技術特點 二、安裝三、使用說明環境要求 四、版本更新五、當前限制 一、項目概覽 MixTeX是一款創新的多模態LaTeX識別小程序&#xff0c;支持本地離線環境下的高效CPU推理。 無論是LaTeX公式、表格還是混合文本&#xff0c;MixTeX都能輕…

簡單 Linux 字符設備驅動程序

注&#xff1a;本文為 “Linux 字符設備驅動” 相關文章合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 Simple Linux character device driver 簡單 Linux 字符設備驅動程序 Oleg Kutko…

NX949NX952美光科技閃存NX961NX964

NX949NX952美光科技閃存NX961NX964 在半導體存儲領域&#xff0c;美光科技始終扮演著技術引領者的角色。其NX系列閃存產品線憑借卓越的性能與創新設計&#xff0c;成為數據中心、人工智能、高端消費電子等場景的核心組件。本文將圍繞NX949、NX952、NX961及NX964四款代表性產品…

協議路由與路由協議

協議路由”和“路由協議”聽起來相似&#xff0c;但其實是兩個完全不同的網絡概念。下面我來分別解釋&#xff1a; 一、協議路由&#xff08;Policy-Based Routing&#xff0c;PBR&#xff09; ? 定義&#xff1a; 協議路由是指 根據預設策略&#xff08;策略路由&#xff0…

Linux510 ssh服務 ssh連接

arning: Permanently added ‘11.1.1.100’ (ECDSA) to the list of known hosts. rooot11.1.1.100’s password: Permission denied, please try again. rooot11.1.1.100’s password: Permission denied, please try again 還沒生效 登不上了 失效了 sshcaozx26成功登錄 …

金融學知識筆記

金融學知識筆記 一、引言 金融學它結合了數學、概率論、統計學、經濟學和計算機科學等多學科的知識&#xff0c;用于解決金融領域中的各種問題&#xff0c;如金融衍生品定價、投資組合優化、風險管理和固定收益證券分析等。通過對金融學的學習&#xff0c;我們可以更好地理解…

AB測試面試題

AB測試面試題 常考AB測試問答題(1)AB測試的優缺點是什么?(2)AB測試的一般流程/介紹一下日常工作中你是如何做A/B實驗的?(3)第一類錯誤 vs 第二類錯誤 vs 你怎么理解AB測試中的第一、二類錯誤?(4)統計顯著=實際顯著?(5)AB測試效果統計上不顯著?(6)實驗組優于對…

USR-M100采集數據并提交MQTT服務器

本文為記錄備忘&#xff0c;不做過多解釋。 模塊自身帶有2路數字量輸入&#xff0c;2路模擬量輸入&#xff0c;2路485接口 數字量接報警輸入&#xff0c;模擬量接壓力傳感器&#xff0c;液位傳感器&#xff0c;485接口分別接流量計&#xff0c;溫濕度傳感器。 正確接線&…

Octave 繪圖快速入門指南

目錄 1. 基本的 2D 繪圖 2. 自定義圖形樣式 3. 繪制散點圖 4. 繪制柱狀圖 5. 繪制直方圖 6. 3D 繪圖 6.6.1 3D 曲面圖 6.6.2 3D 散點圖 7. 繪制極坐標 8. 多子圖繪制 總結 Octave 是一個類似于 MATLAB 的開源數學軟件&#xff0c;廣泛用于數值計算和數據分析。它提供…

RabbitMQ--基礎篇

RabbitMQ 簡介&#xff1a;RabbitMQ 是一種開源的消息隊列中間件&#xff0c;你可以把它想象成一個高效的“郵局”。它專門負責在不同應用程序之間傳遞消息&#xff0c;讓系統各部分能松耦合地協作 優勢&#xff1a; 異步處理&#xff1a;比如用戶注冊后&#xff0c;主程序將發…

【MySQL】事務(重點)

目錄 一、什么是事務&#xff1a; 二、事務的前置知識了解 引擎是否支持事務 事務的提交方式 事務操作的前置準備&#xff1a; 三、事務回滾&#xff1a; 四、事務崩潰&#xff1a; 原子性&#xff1a; 持久性&#xff1a; 五、自動提交和手動提交&#xff1a; 六、…

C++STL——stack,queue

stack與queue 前言容器適配器deque 前言 本篇主要講解stack與queue的底層&#xff0c;但并不會進行實現&#xff0c;stack的接口 queue的接口 &#xff0c;關于stack與queue的接口在這里不做講解&#xff0c;因為通過前面的對STL的學習&#xff0c;這些接口都是大同小異的。 …

STM32智能手表:基于FreeRTOS

引言 隨著物聯網和可穿戴設備的快速發展&#xff0c;智能手表作為典型代表&#xff0c;集成了傳感器數據采集、實時顯示、無線通信等多項功能。本文將深入剖析一個基于STM32和FreeRTOS的智能手表項目&#xff0c;從硬件架構到軟件設計&#xff0c;逐步講解如何構建一個完整的嵌…

leetcode504.七進制數

標簽&#xff1a;進制轉換 機試真題 給定一個整數 num&#xff0c;將其轉化為 7 進制&#xff0c;并以字符串形式輸出。 示例 1: 輸入: num 100 輸出: "202" 示例 2: 輸入: num -7 輸出: "-10" 思路&#xff1a;求n進制就是循環取余數&#xff0c;…

中國古代史2

夏朝&#xff08;公元前2070-公元前1600年&#xff09; 1.禹建立了我國歷史上第一個奴隸制國家–夏朝&#xff0c;定都陽城。禹傳啟&#xff0c;世襲制代替禪讓制。 2.夏代都城&#xff1a;二里頭遺址位于今河南洛陽偃師二里頭村。發現了大型綠松石龍形器&#xff0c;被命名為…

死鎖的形成

死鎖的形成 背景學習資源死鎖的本質 背景 面試可能會被問到. 學習資源 一個案例: https://www.bilibili.com/video/BV1pz421Y7kM 死鎖的本質 互相持有對方的資源. 存在資源競爭都沒有釋放. 可能出現死鎖. insert into demo_user (no, name) values (6, ‘test1’) on dupl…

MapReduce架構-打包運行

&#xff08;一&#xff09;maven打包 MapReduce是一個分布式運算程序的編程框架&#xff0c;是用戶開發“基于Hadoop的數據分析應用”的核心框架。 MapReduce核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序&#xff08;例如&#xff1a;jar…

C++發起Https連接請求

需要下載安裝openssl //stdafx.h #pragma once #include<iostream> #include <openssl/ssl.h> #include <openssl/err.h> #include <iostream> #include <string>#pragma comment(lib, "libssl.lib") #pragma comment(lib, "lib…

ADI ADRV902x的射頻模擬信號輸入輸出端口的巴倫匹配

根據規格書可知ADRV902x系列的&#xff1a; 【1】輸入阻抗是100Ω差分&#xff0c;包括RX端口和ORX端口。 【2】輸出阻抗是50Ω差分&#xff0c;包括TX端口。 而射頻系統通常采用50Ω的單端走線&#xff0c;所以需要通過正確規格的巴倫完成差分轉單端/單端轉差分的處理。 巴…

【計算機視覺】OpenCV實戰項目:Athlete-Pose-Detection 運動員姿態檢測系統:基于OpenCV的實時運動分析技術

運動員姿態檢測系統&#xff1a;基于OpenCV的實時運動分析技術 1. 項目概述1.1 技術背景1.2 項目特點 2. 技術架構與算法原理2.1 系統架構2.2 核心算法2.3 模型選擇 3. 項目部署與運行指南3.1 環境準備硬件要求軟件依賴 3.2 項目配置3.3 運行項目基本運行模式高級參數 4. 常見問…