主頁 > .NET開發 > C#實體(經典):四路光電開關&激光雷達資料采集和波形圖繪制

C#實體(經典):四路光電開關&激光雷達資料采集和波形圖繪制

2020-10-16 01:40:39 .NET開發

前言:本文全部純手工打造,如有疏漏之處,還請諒解!

如果需要查看更多文章,請微信搜索公眾號 csharp編程大,需要進C#交流群群請加微信z438679770,備注進群, 我邀請你進群! ! !

 

這篇文章涉及較多C#重要知識點,如果都能看懂,你至少可以算得上入門了!有興趣的同志可以下載原始碼除錯.

開始吧:

-》指令格式介紹

激光測距模塊

UDP: 192.168.1.200  8008發往8010;192.168.1.201    8008發往8011;

協議:C3 00為195cm

 

 

 

光電開關模塊

UDP:192.168.1.202  8008發往8012

幀頭59 59

資料 01 01 01 01 為4個光電開關狀態,依次為安檢通道入口光電開關、安檢門光電開關1、安檢門光電開關2,安檢通道出口光電開關,其中1為無人遮擋狀態,0為有人遮擋狀態

填充 44 55 66 77 88 99 00 12 23 34 45 56 67 ee

 

 

4個光電開關均無人

 

1、2、3光電開關有人 4光電開關無人

開發軟硬體環境:

硬體:1. 4路光電開關,4路測距雷達,資料通過udp發送到主機192.168.1.119

 軟體:1. vs2017 + win10 

 

-》重要知識點:

1. 多執行緒操作:thread和task的使用

2. winform的chart控制元件使用

3.佇列Queue和list使用

4.雙緩沖用法

5.定時器操作

6.執行緒中操作主表單控制元件:

this.Invoke((EventHandler)delegate

 {

 richTextBoxEx1.Text += stringData + "\r\n";

}):

7.通過回圈的方式遍歷操作控制元件

8.資料型別轉換:

 Byte[] recv = client.Receive(ref endpoint);

 string stringData = "https://www.cnblogs.com/zyr365/archive/2020/10/12/0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();

-》開發難點:

1. chart需要繪制所有采集上來的資料點,光電開關1毫秒就一組資料,繪圖時間得跟得上

2. 多執行緒的靈活使用

全部代碼:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace lidarTest
{
    public partial class mainForm : DevComponents.DotNetBar.Office2007Form
    {
        public mainForm()
{
            this.DoubleBuffered = true;//設定本表單
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
            SetStyle(ControlStyles.DoubleBuffer, true); // 雙緩沖

            this.EnableGlass = false;
            InitializeComponent();
            InitChart();
            checkBox2.Checked = false;
            checkBox1.Checked = false;
        }
        private Queue<int>[] dataQueue = new Queue<int>[8];//把Queue<double>看成一個型別 int[] a=new int [8]
        private List<int>[] dataList = new List<int>[8];
        private Queue<string> dQueue = new Queue<string>();
        bool isStart = false;
        int count = 0;
        private static readonly object Lock = new object();
        Stopwatch elapsetime = new Stopwatch();
        private void mainForm_Load(object sender, EventArgs e)
{
            dataQueue[0] = new Queue<int>();
            dataQueue[1] = new Queue<int>();
            dataQueue[2] = new Queue<int>();
            dataQueue[3] = new Queue<int>();
            dataQueue[4] = new Queue<int>();
            dataQueue[5] = new Queue<int>();
            dataQueue[6] = new Queue<int>();
            dataQueue[7] = new Queue<int>();

            dataList[0] = new List<int>();
            dataList[1] = new List<int>();
            dataList[2] = new List<int>();
            dataList[3] = new List<int>();
            dataList[4] = new List<int>();
            dataList[5] = new List<int>();
            dataList[6] = new List<int>();
            dataList[7] = new List<int>();

            this.WindowState = FormWindowState.Normal;
            this.FormBorderStyle = FormBorderStyle.Sizable;
            this.Top = 0;
            this.Left = 0;
            this.Width = Screen.PrimaryScreen.WorkingArea.Width;
            this.Height = Screen.PrimaryScreen.WorkingArea.Height;
            Start();

            //MessageBox.Show( DateTime.Now.ToString("yyyy_MM_dd_hh_mm_ss_fff"));
        }
        // 防止閃屏        
        //protected override CreateParams CreateParams
        //{
        //    get
        //    {
        //        CreateParams cp = base.CreateParams;
        //        cp.ExStyle |= 0x02000000;
        //        return cp;
        //    }
        //}

        public void Start()
{
            Thread t1 = new Thread(StartDataRevThread1); //第一路激光雷達資料接收執行緒
            t1.Start();
            t1.IsBackground = true;

            Thread t2 = new Thread(StartDataRevThread2); //第二路激光雷達資料接收執行緒
            t2.Start();
            t2.IsBackground = true;

            Thread t3 = new Thread(StartDataRevThread3);//第三路激光雷達資料接收執行緒
            t3.Start();
            t3.IsBackground = true;

            Thread t4 = new Thread(StartDataRevThread4);////第四路激光雷達資料接收執行緒
            t4.Start();
            t4.IsBackground = true;

            Thread t5 = new Thread(StartDataRevThread5);//四個廣電開關資料接受執行緒
            t5.Start();
            t5.IsBackground = true;

            Thread t6 = new Thread(dataSaveThread6);//資料寫入執行緒
            t6.Start();
            t6.IsBackground = true;
        }
        private void StartDataRevThread1()
{
            try
            {
                UdpClient client = new UdpClient(8021);
                //IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);//
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.30"), 8008);
                //client.Client.ReceiveBufferSize = 40960;//40960 默認值是8192
                while (true)
                {
                    Byte[] recv = client.Receive(ref endpoint);
                    string stringData = "https://www.cnblogs.com/zyr365/archive/2020/10/12/0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();
                    this.Invoke((EventHandler)delegate
                        {
                            //richTextBoxEx1.Text += stringData + "\r\n";
                            chartShow( recv[2] + (recv[3]<<8),1);
                        }
                        );
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message + "\n" + ex.StackTrace) ;
            }
        }
        private void StartDataRevThread2()
{
            try
            {
                UdpClient client = new UdpClient(8022);
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.40"), 8008);
                while (true)
                {
                    Byte[] recv = client.Receive(ref endpoint);
                    string stringData = "https://www.cnblogs.com/zyr365/archive/2020/10/12/0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();
                    this.Invoke((EventHandler)delegate
                    {
                        //richTextBoxEx2.Text += stringData + "\r\n";
                        chartShow(recv[2] + (recv[3] << 8),2);
                    }
                      );
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
            }
        }
        private void StartDataRevThread3()
{
            try
            {
                UdpClient client = new UdpClient(8023);
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 8008);
                while (true)
                {
                    Byte[] recv = client.Receive(ref endpoint);
                    string stringData = "https://www.cnblogs.com/zyr365/archive/2020/10/12/0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();
                    this.Invoke((EventHandler)delegate
                    {
                        //richTextBoxEx3.Text += stringData + "\r\n";
                        chartShow( recv[2] + (recv[3] << 8),3);
                    }
                      );
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
            }
        }
        private void StartDataRevThread4()
{
            try
            {
                UdpClient client = new UdpClient(8024);
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.200"), 8008);
                while (true)
                {
                    Byte[] recv = client.Receive(ref endpoint);
                    string stringData = "https://www.cnblogs.com/zyr365/archive/2020/10/12/0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();
                    this.Invoke((EventHandler)delegate
                    {
                        //richTextBoxEx4.Text += stringData + "\r\n";
                        chartShow( recv[2] + (recv[3] << 8),4);
                    }
                      );
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
            }
        }

        private void StartDataRevThread5()
{
            try
            {
                UdpClient client = new UdpClient(8012);
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.202"), 8008);
                client.Client.ReceiveBufferSize = 1024*1024;//默認值是8192
                while (true)
                {
                    Byte[] recv = client.Receive(ref endpoint);
                    elapsetime.Restart();//計時開始
                    this.Invoke((EventHandler)delegate
                    {
                        //if (count >= 100)
                        {
                            count = 0;
                            Task.Run(() =>
                            {
                                chartShow(recv[2], 5);
                            }
                            );
                            Task.Run(() =>
                            {
                                chartShow(recv[3], 6);
                            }
                            );
                            Task.Run(() =>
                            {
                                chartShow(recv[4], 7);
                            }
                           );
                            Task.Run(() =>
                            {
                                chartShow(recv[5], 8);
                            }
                          );
                            //chartShow(recv[2], 5);
                            //chartShow(recv[3], 6);
                            //chartShow(recv[4], 7);
                            //chartShow(recv[5], 8);

                            if (checkBox2.Checked == true)
                            {
                                string stringData = "https://www.cnblogs.com/zyr365/archive/2020/10/12/0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();
                                dQueue.Enqueue(DateTime.Now.ToString("yyyy-MM-dd_HH:mm:ss:fff") + "  " + stringData);
                            }
                         

                        }
                        count++;

                    } );
                    elapsetime.Stop();//計時結束
                    this.Invoke((EventHandler)delegate
                    {
                        label1.Text = "接收資料耗時:"+ elapsetime.ElapsedMilliseconds.ToString("0000");
                    });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
            }
        }
        private void dataSaveThread6()
{
            while (true)
            {
                if (checkBox2.Checked == true)
                {
                    String LogPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log");
                    if (dQueue.Count() > 0)
                        strWrite(dQueue.Dequeue(), LogPath, "log.txt");
                }
            }
        }
        private void InitChart()
{
            Chart[] ch = new Chart[12] { chart1, chart2, chart3, chart4,chart5, chart6, chart7, chart8 , chart_1, chart_2, chart_3, chart_4 };
            for (int i = 0; i < 4 ; i++)
            {
                ch[i].ChartAreas.Clear();
                ChartArea chartArea1 = new ChartArea("C1");
                ch[i].ChartAreas.Add(chartArea1);
                //定義存盤和顯示點的容器
                ch[i].Series.Clear();
                Series series1 = new Series("S1");
                series1.ChartArea = "C1";
                ch[i].Series.Add(series1);

                ch[i].ChartAreas[0].AxisY.IsStartedFromZero = false;
                ch[i].Legends[0].Enabled = false;

                ch[i].ChartAreas[0].AxisX.Interval = 100;
                ch[i].ChartAreas[0].AxisX.Maximum = 1000;
                //ch[i].ChartAreas[0].AxisX.ScaleView.Size = 8;//設定圖表可視區域資料點數,說白了一次可以看到多少個X軸區域

                ch[i].ChartAreas[0].Axes[0].MajorGrid.Enabled = false;
                ch[i].ChartAreas[0].Axes[1].MajorGrid.Enabled = false;
                //y軸上網格
                //ct.ChartAreas[0].Axes[1].MajorGrid.Enabled = false;  
                //ch[i].ChartAreas[0].AxisX.IsStartedFromZero = false;
                //ch[i].ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
                //ch[i].ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
                //設定標題
                ch[i].Titles.Clear();
                //ch[i].Titles.Add("S01");
                //ch[i].Titles[0].Text = "通道" + (i + 1) + " 折線圖顯示";
                //ch[i].Titles[0].ForeColor = Color.RoyalBlue;
                //ch[i].Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
                //設定圖表顯示樣式
                ch[i].Series[0].Color = Color.Red;
                //this.chart1.Titles[0].Text = string.Format("{0}折線圖顯示", );
                ch[i].Series[0].ChartType = SeriesChartType.FastLine;
                ch[i].Series[0].Points.Clear();
            }
            for (int i = 4; i < 12; i++)
            {
                ch[i].ChartAreas.Clear();
                ChartArea chartArea1 = new ChartArea("C1");
                ch[i].ChartAreas.Add(chartArea1);
                //定義存盤和顯示點的容器
                ch[i].Series.Clear();
                Series series1 = new Series("S1");
                series1.ChartArea = "C1";
                ch[i].Series.Add(series1);

                ch[i].ChartAreas[0].AxisY.IsStartedFromZero = false;
                ch[i].Legends[0].Enabled = false;

                //ch[i].ChartAreas[0].AxisX.Interval = 100;
                //ch[i].ChartAreas[0].AxisX.Maximum = 10000;
                //ch[i].ChartAreas[0].AxisX.ScaleView.Size = 8;//設定圖表可視區域資料點數,說白了一次可以看到多少個X軸區域

                ch[i].ChartAreas[0].Axes[0].MajorGrid.Enabled = false;
                ch[i].ChartAreas[0].Axes[1].MajorGrid.Enabled = false;
                //y軸上網格
                //ct.ChartAreas[0].Axes[1].MajorGrid.Enabled = false;  
                //ch[i].ChartAreas[0].AxisX.IsStartedFromZero = false;
                //ch[i].ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
                //ch[i].ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
                //設定標題
                ch[i].Titles.Clear();
                //ch[i].Titles.Add("S01");
                //ch[i].Titles[0].Text = "通道" + (i + 1) + " 折線圖顯示";
                //ch[i].Titles[0].ForeColor = Color.RoyalBlue;
                //ch[i].Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
                //設定圖表顯示樣式
                ch[i].Series[0].Color = Color.Red;
                //this.chart1.Titles[0].Text = string.Format("{0}折線圖顯示", );
                ch[i].Series[0].ChartType = SeriesChartType.FastLine;
                ch[i].Series[0].Points.Clear();
            }
        }

        public void chartShow(int y, int ch)
{

            Chart[] chNum = new Chart[8] { chart_1, chart_2, chart_3, chart_4, chart5, chart6, chart7, chart8 };
            if (ch <= 8)
                chartDisplay(chNum[ch - 1], ch, y);

        }
        delegate void ChartDelegate(Chart chart, int ch, int y);
        private void chartDisplay(Chart chart, int ch, int y)
{

            if (chart.InvokeRequired)
            {
                ChartDelegate chartDelegate = chartDisplay;
                chart.Invoke(chartDelegate, new object[] { chart, ch, y });
            }
            else
            {
                lock (Lock)
                {
                    if (isStart == true)
                        UpdateQueueValue(ch, y);//點擊開啟按鈕后,開始采集收集資料,并更新到佇列或串列中
                   
                }
            }
        }
        private void UpdateQueueValue(int ch, int y)
{
            lock (Lock)
            {
                if (dataQueue[ch - 1].Count > 1000)
                    //先出列
                    dataQueue[ch - 1].Dequeue();
                dataQueue[ch - 1].Enqueue(y);
                //方法二 用list
                //if (dataList[ch - 1].Count > 20000)
               //     dataList[ch - 1].RemoveAt(0);
               
                //dataList[ch - 1-4].Add(2);
                dataList[ch - 1].Add(y);
            }
        }
        private void btnStart_Click(object sender, EventArgs e)
{

            if (!isStart)
            {
               dataQueue[0] = new Queue<int>();
               dataQueue[1] = new Queue<int>();
               dataQueue[2] = new Queue<int>();
               dataQueue[3] = new Queue<int>();
               dataQueue[4] = new Queue<int>();
               dataQueue[5] = new Queue<int>();
               dataQueue[6] = new Queue<int>();
               dataQueue[7] = new Queue<int>();

                dataList[0] = new List<int>();
                dataList[1] = new List<int>();
                dataList[2] = new List<int>();
                dataList[3] = new List<int>();
                dataList[4] = new List<int>();
                dataList[5] = new List<int>();
                dataList[6] = new List<int>();
                dataList[7] = new List<int>();

                chart_1.Series[0].Points.Clear();
                chart_2.Series[0].Points.Clear();
                chart_3.Series[0].Points.Clear();
                chart_4.Series[0].Points.Clear();
                chart5.Series[0].Points.Clear();
                chart6.Series[0].Points.Clear();
                chart7.Series[0].Points.Clear();
                chart8.Series[0].Points.Clear();

                btnStart.Text = @"停止采集";
                btnStart.DisabledImage = btnStart.Image;
                btnStart.Image = (Image)btnStart.PressedImage.Clone();
                isStart = !isStart;

            }
            else
            {
                btnStart.Text = @"開始采集";
                btnStart.Image = btnStart.DisabledImage;
                isStart = !isStart;
            }
        }
        /*************檔案寫入函式**************/
        private void strWrite(string str, string filePath, string fileName)
{
            lock (Lock)
            {
                if (!Directory.Exists(filePath))
                    Directory.CreateDirectory(filePath);
                if (!File.Exists(filePath + "\\" + fileName))
                    File.Create(filePath + "\\" + fileName).Close(); //.Close 很關鍵,不然會有問題

                StreamWriter sw = new StreamWriter(filePath + "\\" + fileName, true);//true 追加資料
                sw.WriteLine(str);
                sw.Close();
            }         
        }
        /*************chart圖片保存函式**************/
        private void imageSave( Chart chart, string filePath, string fileName)
{
            lock (Lock)
            {
                if (!Directory.Exists(filePath))
                    Directory.CreateDirectory(filePath);
                chart.SaveImage(filePath +"\\" + fileName, ChartImageFormat.Png);
            }
        }

        /*************定時器中更新chart**************/
        private void timer1_Tick(object sender, EventArgs e)
{

            Chart[] ch = new Chart[8] { chart1, chart2, chart3, chart4, chart5, chart6, chart7, chart8 };
            Chart[] cha = new Chart[4] { chart_1, chart_2, chart_3, chart_4 };
            string[] str = new string[8] { "chart1", "chart2", "chart3", "chart4", "chart5", "chart6", "chart7", "chart8" };
            string[] stri = new string[4] { "chart_1", "chart_2", "chart_3", "chart_4",  };
            Label[] lb = new Label[4] { label2, label3, label4, label5 };

            
            for (int j = 4; j < 8; j++)
            {
                Stopwatch sw = new Stopwatch();
                var k = j;//引數需要傳入task中,不然j一直是7
                Task.Run(() =>
            {

                sw.Start();
                this.Invoke((EventHandler)delegate
                {
                    //chart5.Series[0].Points.Clear();
                    for (int i = 0; i < dataList[k].Count; i++)
                        ch[k].Series[0].Points.AddY(dataList[k][i]);//光電開關波形圖-所有點
                    dataList[k].Clear();

                    ch[k-4].Series[0].Points.Clear();
                    for (int i = 0; i < dataQueue[k].Count; i++)
                        ch[k - 4].Series[0].Points.AddY(dataQueue[k].ElementAt(i));//光電開關波形圖-最近1000個點


                    for (int i = 0; i < dataList[k-4].Count; i++)
                        cha[k - 4].Series[0].Points.AddY(dataList[k-4][i]);//激光測距雷達波形圖--所有點
                    dataList[k-4].Clear();

                    if (checkBox1.Checked == true)
                    {
                        //保存曲線圖片
                        String imagePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "image//" + str[k]);
                        imageSave(ch[k], imagePath, DateTime.Now.ToString("yyyy_MM_dd_hh_mm_ss_fff") + ".png");
                    }
                    sw.Stop();
                    lb[k - 4].Text = sw.ElapsedMilliseconds.ToString(str[k] + "耗時:" + "0000");//記錄chart繪制的好事呢
                });

            });
            }


        }
  
    }
}

  運行結果:

 

 

專案原始碼下載地址:

鏈接:https://pan.baidu.com/s/1QfoIVNarj-rgK449JM40yQ 

提取碼:v2nu 

------------------------------------------------------------------------

如果需要查看更多文章,請微信搜索公眾號 csharp編程大全,需要進C#交流群群請加微信z438679770,備注進群, 我邀請你進群! ! !

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/173447.html

標籤:.NET技术

上一篇:寫了多年代碼,你會 StackOverflow 嗎

下一篇:Global定時器任務使用。.NET定時執行方法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more