最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# winform多線程死循環(huán)踩坑

 更新時(shí)間:2023年12月22日 09:56:47   作者:一瓶酒九塊九  
本文主要介紹了c# winform多線程死循環(huán)踩坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

問題:

我在一個(gè)子窗體中創(chuàng)建了三個(gè)線程,分別讀取一個(gè)PLC的50個(gè)標(biāo)簽,一共150個(gè),當(dāng)我把子窗體打開時(shí)開始讀取,當(dāng)把子窗體關(guān)閉后停止讀取,再次打開時(shí)又重新開始讀取。
第一次打開時(shí)速度(ms)是這樣的:

第二次就變成了這樣:

時(shí)間差不多翻了一倍,開關(guān)子窗體的次數(shù)越多越慢。

循環(huán)讀取數(shù)據(jù)的代碼如下:

一共三個(gè),這里只放一個(gè),另外兩個(gè)是差不多的

private async void ReadPlcData1()
{
    while (true)
    {
        try
        {
            stopwatch1 = Stopwatch.StartNew();
            plcData1[0] = await readOmronData.ReadOneOmronData(FrmMain.omronCipNet1, "s_SysStrip1.Status.Homed", "BOOL");
            plcData1[1] = await readOmronData.ReadOneOmronData(FrmMain.omronCipNet1, "s_SysStrip1.Status.Homing", "BOOL");
            plcData1[2] = await readOmronData.ReadOneOmronData(FrmMain.omronCipNet1, "s_SysStrip1.Status.ErrHome", "BOOL");
            plcData1[3] = await readOmronData.ReadOneOmronData(FrmMain.omronCipNet1, "s_SysStrip1.Status.MoveDone", "BOOL");
            .......
            plcData1[49] = await readOmronData.ReadOneOmronData(FrmMain.omronCipNet1, "s_SysStrip1Move.Cmd.Pos.JogVel", "REAL");
            for(int i = 0; i < 50; i++)
            {
                string labelName = $"label{i+1}";
                Control[] labels = Controls.Find(labelName, true);
                foreach (var label in labels)//修改label
                {
                    if (label.Name == labelName)
                    {
                        Invoke(new Action(() =>
                        {
                            label.Text = plcData1[i].ToString();
                        }));
                    }
                }
            }
            stopwatch1.Stop();
            TimeSpan elapsed = stopwatch1.Elapsed;
            Invoke(new Action(() =>
            {
                RecvCount++;
                tb_recvCount.Text = RecvCount.ToString();
                tb_timeSpan1.Text = elapsed.TotalMilliseconds.ToString();
            }));
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message, "HomeReadData");
        }
    }
}

創(chuàng)建線程的代碼如下

private void StartThreadReadPlcData1()
{
      // 啟動線程
      threadReadPlcData1 = new System.Threading.Thread(new System.Threading.ThreadStart(ReadPlcData1));
      threadReadPlcData1.IsBackground = true;
      threadReadPlcData1.Start();

      // 啟動線程
      threadReadPlcData2 = new System.Threading.Thread(new System.Threading.ThreadStart(ReadPlcData2));
      threadReadPlcData2.IsBackground = true;
      threadReadPlcData2.Start();

      // 啟動線程
      threadReadPlcData3 = new System.Threading.Thread(new System.Threading.ThreadStart(ReadPlcData3));
      threadReadPlcData3.IsBackground = true;
      threadReadPlcData3.Start();
  }

答案:

就是死循環(huán),線程沒有被釋放掉。
每次打開這個(gè)窗體會創(chuàng)建3個(gè)后臺線程,線程中是一個(gè)while循環(huán),不斷的讀取數(shù)據(jù),當(dāng)子窗體關(guān)閉時(shí)后臺線程應(yīng)該被釋放掉,但是實(shí)際上這個(gè)while循環(huán)沒有被釋放,仍然在運(yùn)行,也就是說每次打開子窗體,都會創(chuàng)建3個(gè)釋放不掉的線程占據(jù)資源,所以會越來越卡。

解決:

添加循環(huán)結(jié)束標(biāo)志,在子窗體關(guān)閉的時(shí)候結(jié)束while循環(huán)。

private void FrmMenu_FormClosing(object sender, FormClosingEventArgs e)
{
    for (int i = 0; i < stopThreadFlag.Length; i++)
    {
        stopThreadFlag[i] = true;
    }
}

然后讀取數(shù)據(jù)的循壞while(true)改為while (!stopThreadFlag[i]) 。

到此這篇關(guān)于c# winform多線程死循環(huán)踩坑的文章就介紹到這了,更多相關(guān)c# winform多線程死循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 區(qū)分C# 中的 Struct 和 Class

    區(qū)分C# 中的 Struct 和 Class

    這篇文章主要介紹了如何區(qū)分C# 中的 Struct 和 Class,幫助大家更好的理解和學(xué)習(xí)c#編程,感興趣的朋友可以了解下
    2020-09-09
  • C#基于XNA生成隨機(jī)顏色的方法

    C#基于XNA生成隨機(jī)顏色的方法

    這篇文章主要介紹了C#基于XNA生成隨機(jī)顏色的方法,涉及XNA Color類的使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#使用LibUsbDotNet實(shí)現(xiàn)USB設(shè)備檢測

    C#使用LibUsbDotNet實(shí)現(xiàn)USB設(shè)備檢測

    C#?LibUsbDotNet是一個(gè).NET平臺上的庫,用于訪問USB設(shè)備,它封裝了Linux下的libusb庫,LibUsbDotNet提供了一個(gè)簡單的API,開發(fā)者可以利用這個(gè)庫在C#中操作USB設(shè)備,本文介紹了C#使用LibUsbDotNet實(shí)現(xiàn)USB設(shè)備檢測,需要的朋友可以參考下
    2024-07-07
  • C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解

    C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解

    在面向?qū)ο缶幊讨?,SOLID?是五個(gè)設(shè)計(jì)原則的首字母縮寫,旨在使軟件設(shè)計(jì)更易于理解、靈活和可維護(hù)。本文將通過實(shí)例詳細(xì)講講C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則,需要的可以參考一下
    2022-07-07
  • C#不重復(fù)輸出一個(gè)數(shù)組中所有元素的方法

    C#不重復(fù)輸出一個(gè)數(shù)組中所有元素的方法

    這篇文章主要介紹了C#不重復(fù)輸出一個(gè)數(shù)組中所有元素的方法,涉及C#針對數(shù)組的遍歷、校驗(yàn)及排序等操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#使用CallContext緩存線程數(shù)據(jù)

    C#使用CallContext緩存線程數(shù)據(jù)

    這篇文章介紹了C#使用CallContext緩存線程數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • des加密解密源碼 C# key值問題分析

    des加密解密源碼 C# key值問題分析

    本文主要介紹了des加密解密源碼,C# key值問題,大家參考使用吧
    2014-01-01
  • C#使用JsonConvert全面解析JSON

    C#使用JsonConvert全面解析JSON

    這篇文章主要介紹了C#使用JsonConvert全面解析JSON,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • c#使用S22.Imap收劍靈激活碼郵件代碼示例(imap收郵件)

    c#使用S22.Imap收劍靈激活碼郵件代碼示例(imap收郵件)

    一個(gè)IMAP收發(fā)郵件的類庫S22.IMAP,方便易用,下面來個(gè)例子可以收劍靈激活碼郵件
    2013-12-12
  • 詳解C# winform ListView的基本操作

    詳解C# winform ListView的基本操作

    本文主要介紹了C# winform ListView的基本操作,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

申扎县| 辉县市| 开封县| 克东县| 石狮市| 临沭县| 巧家县| 图片| 玛多县| 鄂托克旗| 东丽区| 建水县| 张家界市| 乐安县| 庄河市| 西吉县| 莎车县| 循化| 台中市| 定州市| 连州市| 中方县| 衡水市| 沅江市| 温宿县| 三穗县| 怀仁县| 威远县| 出国| 大余县| 镇远县| 灵石县| 翁源县| 白水县| 聊城市| 昆山市| 蓝山县| 广河县| 乐平市| 临夏县| 满城县|