国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# 中多線程鎖的使用經(jīng)驗

這篇具有很好參考價值的文章主要介紹了C# 中多線程鎖的使用經(jīng)驗。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

C# 中多線程鎖的使用經(jīng)驗:全局鎖,實例鎖

全局鎖

????????private static object _exeLock = new object();

? ? ? ?static 靜態(tài)的是全應(yīng)用程序的資源。如果在一個類里定義了這樣一個鎖,你在調(diào)用使用這個類的時候,是NEW了一個對象,并把這個對象給了一個靜態(tài)全局變量中保存。這時這個鎖就是全局鎖了。

? ? ? ? 你在調(diào)用帶鎖的方法時會受到【全局鎖】的影響。

實例鎖

????????private object _exeLock = new object();

? ? ? ? 影響只在這個對象實例中。

示例

全局鎖代碼

類的代碼

/// <summary>
/// 雷賽板卡 AxisDMC3000
/// </summary>
public class DMC3000 : AxisModel
{
    public DMC3000() { }

    public DMC3000(string name) { }

    /// <summary>
    /// 全局鎖
    /// </summary>
    private static object _exeLockAll = new object();

    /// <summary>
    /// 對象鎖
    /// </summary>
    //private object _exeLock = new object();

    /// <summary>
    /// 移動到指定位置
    /// </summary>
    /// <param name="posname">位置名稱</param>
    /// <returns></returns>
    public override bool MoveAbs(string posname)
    {
        var isFinsh = false;
        lock (_exeLockAll)
        {
            try
            {
                int dis = (int)(GetAxisPosList(posname) * Param.PulseRatio);
                SetAxisParam();
                //單軸運動函數(shù)
                //Dist 目標(biāo)位置,單位:pulse,范圍:-134217728~+134217728
                //posi_mode 運動模式,0:相對坐標(biāo)模式,1:絕對坐標(biāo)模式
                isFinsh = LTDMC.dmc_pmove(CardNum, AxisNum, dis, 1) == 0;
            }
            catch (Exception ex)
            {
                isFinsh = false;
                WorkFlow.ShowMsgError("MoveAbs(string posname) 異常:" + ex.Message,
                    "MoveAbs(string posname)");
            }
        }
        return isFinsh;
    }
}

上面的代碼中有一個【全局鎖】和一個用了【全局鎖】的方法

調(diào)用這個類時的代碼

創(chuàng)建兩個類對象

#region 軸
/// <summary>
/// (焊接)X軸 左右移動X軸
/// </summary>
private static DMC3000 _axis_CarryX;

/// <summary>
/// (焊接)Y軸 前后移動Y軸
/// </summary>        
private static DMC3000 _axis_CarryY;//Axis_CarryY = 1,

/// <summary>
/// 送針X 左右移動
/// </summary>
private static DMC3000 _axis_SongzhengX;
#endregion

/// <summary>
/// 初始化 軸
/// </summary>
/// <returns></returns>
public static bool InitAxis()
{
    var isFinish = false;
    _axis_CarryX = new DMC3000(AxisType.Axis_CarryX.ToString());
    _axis_CarryY = new DMC3000(AxisType.Axis_CarryY.ToString());
    _axis_SongzhengX = new DMC3000(AxisType.Axis_SongzhengX.ToString());
    return isFinish;
}

上面三個軸都是new的方式生成是三個獨立的對象。

但在用線程Task調(diào)用MoveAbs方法時你會發(fā)現(xiàn),三個軸的運動情況是一個一個的移動。而不是同時移動的

public static void Test()
{
    Task.Factory.StartNew(() => {
        _axis_CarryX.MoveAbs("ToPos");
    });
    Task.Factory.StartNew(() => {
        _axis_CarryY.MoveAbs("ToPos");
    });
    Task.Factory.StartNew(() => {
        _axis_SongzhengX.MoveAbs("ToPos");
    });
}

原因就是對象里使用對【全局鎖】每個對象在調(diào)用MoveAbs方法時都會進(jìn)行排對,第一個線程用完后,第二個線程去用。以此類推。這像就相對于是單線程了,上面開了三個線程去執(zhí)行,完全沒有用和不用Task調(diào)用是一樣的。這樣的效果一定不是我們所希望的。那要怎么解決這個問題呢。

? ? ? ? 有人可能會說那就不用鎖了。這樣不是解決問題了嗎?這也是一種解決方法。但我在工作中。發(fā)現(xiàn)一個問題就是在不用鎖時發(fā)現(xiàn)有時軸無法走到指定的點位。在獲取軸當(dāng)前的坐標(biāo)時也不是我們指定的坐標(biāo)位。本文就是為解決這個時而出現(xiàn)的多線程問題而寫的總結(jié)。

? ? ? ? 為了達(dá)到同步效果又要解決一個軸在多個線程中有調(diào)用的情況時。我選擇了【對象鎖】解決問題?!緦ο箧i】從名稱中就可以知道,這鎖的范圍在對象中,不會影響到其他對象的的調(diào)用。這樣就可以解決問題。多線程中同時調(diào)用MoveAbs方法時進(jìn)行鎖排對,執(zhí)行和取讀當(dāng)前坐標(biāo)不會因為多線程為影響。

實例鎖代碼

/// <summary>
/// 雷賽板卡 AxisDMC3000
/// </summary>
public class DMC3000 : AxisModel
{
    public DMC3000() { }

    public DMC3000(string name) { }

    /// <summary>
    /// 對象鎖
    /// </summary>
    private object _exeLock = new object();

    /// <summary>
    /// 移動到指定位置
    /// </summary>
    /// <param name="posname">位置名稱</param>
    /// <returns></returns>
    public override bool MoveAbs(string posname)
    {
        var isFinsh = false;
        lock (_exeLock)
        {
            try
            {
                int dis = (int)(GetAxisPosList(posname) * Param.PulseRatio);
                SetAxisParam();
                //單軸運動函數(shù)
                //Dist 目標(biāo)位置,單位:pulse,范圍:-134217728~+134217728
                //posi_mode 運動模式,0:相對坐標(biāo)模式,1:絕對坐標(biāo)模式
                isFinsh = LTDMC.dmc_pmove(CardNum, AxisNum, dis, 1) == 0;
            }
            catch (Exception ex)
            {
                isFinsh = false;
                WorkFlow.ShowMsgError("MoveAbs(string posname) 異常:" + ex.Message,
                    "MoveAbs(string posname)");
            }
        }
        return isFinsh;
    }
}

代碼差別不大就中對像鎖中沒有使用static關(guān)鍵字。文章來源地址http://www.zghlxwxcb.cn/news/detail-839633.html

到了這里,關(guān)于C# 中多線程鎖的使用經(jīng)驗的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【JAVAEE學(xué)習(xí)】探究Java中多線程的使用和重點及考點

    【JAVAEE學(xué)習(xí)】探究Java中多線程的使用和重點及考點

    ?????? write in front???????? ?????????大家好,我是xiaoxie.希望你看完之后,有不足之處請多多諒解,讓我們一起共同進(jìn)步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie??????????原創(chuàng) CSDN?如需轉(zhuǎn)載還請通知????? 個人主頁:xiaoxie??

    2024年04月15日
    瀏覽(21)
  • 多線程Synchronized鎖的使用與線程之間的通訊

    多線程Synchronized鎖的使用與線程之間的通訊

    多線程同時對同一個全局變量做寫操作,可能會受到其他線程的干擾,就會發(fā)生線程安全問題。 Java中的全局變量是存放在堆內(nèi)存中的,而堆內(nèi)容對于所有線程來說是共享的。 比如下面一個簡單的代碼案例: 代碼比較簡單,我們看下面控制臺的打?。?可以看到兩個線程之間

    2024年02月04日
    瀏覽(20)
  • C# | 上位機(jī)開發(fā)新手指南(二)上位機(jī)通信

    C# | 上位機(jī)開發(fā)新手指南(二)上位機(jī)通信

    在上位機(jī)開發(fā)中,串口通信和TCP通信是兩種常見的通信方式。串口通信是指通過串口將數(shù)據(jù)發(fā)送和接收到控制器或其他外設(shè)中,TCP通信則是通過網(wǎng)絡(luò)將數(shù)據(jù)傳輸?shù)竭h(yuǎn)程設(shè)備中。下面介紹一下為什么學(xué)習(xí)串口通信和TCP通信在上位機(jī)開發(fā)中是很重要的。 在許多工業(yè)自動化控制系統(tǒng)

    2024年02月07日
    瀏覽(49)
  • C#上位機(jī)開發(fā)目錄

    C#上位機(jī)序列1: 多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列) C#上位機(jī)序列2: 同步異步(async、await) C#上位機(jī)序列3: 流程控制(串行,并行,混合) C#上位機(jī)序列4: 動畫效果(模擬PLC設(shè)備運行) C#上位機(jī)序列5: 三菱通信(FX-3U SerialOverTcp) C#上位機(jī)序列

    2024年02月09日
    瀏覽(16)
  • java中多線程去跑海量數(shù)據(jù)使用線程池批量ThreadPoolExecutor處理的方式和使用Fork/Join框架的方式那種效率高?

    在Java中,使用線程池(ThreadPoolExecutor)和使用Fork/Join框架來處理海量數(shù)據(jù)的效率取決于具體的應(yīng)用場景和需求。下面是一些需要考慮的因素: 任務(wù)類型:如果任務(wù)是CPU密集型的,那么使用Fork/Join框架可能更高效,因為它可以自動進(jìn)行任務(wù)分割和并行處理。如果任務(wù)是I/O密集

    2024年02月10日
    瀏覽(22)
  • C# 三菱PLC上位機(jī)開發(fā)環(huán)境搭建

    C# 三菱PLC上位機(jī)開發(fā)環(huán)境搭建

    一、安裝軟件 用到兩個三菱的軟件: 1. MX Component(下載地址?也可以直接在官網(wǎng)上搜索,注意MX后面有空格) 用于連接PLC 2. GX Works2(下載地址?用GX Works3也行) 這個軟件主要是電氣做PLC編程,我們用來作為仿真,省去開發(fā)時擺弄真實PLC 序列號:117-570766844 二、配置軟件 MX

    2023年04月18日
    瀏覽(22)
  • C# WPF上位機(jī)開發(fā)(鍵盤繪圖控制)

    C# WPF上位機(jī)開發(fā)(鍵盤繪圖控制)

    【 聲明:版權(quán)所有,歡迎轉(zhuǎn)載,請勿用于商業(yè)用途。 聯(lián)系信箱:feixiaoxing @163.com】 ? ? ? ? 在軟件開發(fā)中,如果存在canvas圖像的話,一般有幾種控制方法。一種是鼠標(biāo)控制;一種是鍵盤控制;還有一種是定時器控制。定時器控制,多常見動畫、游戲、3d視頻當(dāng)中。而鼠標(biāo)控制

    2024年02月02日
    瀏覽(22)
  • C# | 上位機(jī)開發(fā)新手指南(一)概述

    C# | 上位機(jī)開發(fā)新手指南(一)概述

    C#,是微軟主推的編程語言。它在工業(yè)控制、自動化、物聯(lián)網(wǎng)等領(lǐng)域應(yīng)用非常廣泛。由于國內(nèi)在工業(yè)控制領(lǐng)域技術(shù)發(fā)展路徑的原因,早期的自動化控制面板由Window環(huán)境提供,大量的MFC、VB6控制應(yīng)用被部署在了工廠車間。在用戶習(xí)慣和界面環(huán)境的雙料加持下,給C#在工業(yè)領(lǐng)域的推

    2024年02月03日
    瀏覽(27)
  • C# 上位機(jī)之??迪鄼C(jī)開發(fā)(SDK)

    C# 上位機(jī)之??迪鄼C(jī)開發(fā)(SDK)

    發(fā)現(xiàn)工作中好多計算機(jī)視覺上位機(jī)項目都用??迪鄼C(jī),為了能夠更好的學(xué)習(xí)和工作,我自己依據(jù)同事的源碼和網(wǎng)上的一些總結(jié)編寫本博客。通過本次學(xué)習(xí),讓我明白一點,無論學(xué)習(xí)什么技術(shù)都要學(xué)會自己看技術(shù)文檔,而不是第一時間上網(wǎng)找源碼。以工業(yè)相機(jī)SDK使用說明.chm為例

    2024年02月03日
    瀏覽(33)
  • C# WPF上位機(jī)開發(fā)(Web API聯(lián)調(diào))

    【 聲明:版權(quán)所有,歡迎轉(zhuǎn)載,請勿用于商業(yè)用途。 聯(lián)系信箱:feixiaoxing @163.com】 ? ? ? ? 很多時候,客戶需要開發(fā)的不僅僅是一個上位機(jī)系統(tǒng),它還有其他很多配套的系統(tǒng)或設(shè)備,比如物流小車、立庫、數(shù)字孿生等一整套系統(tǒng)。這個時候,上位機(jī)系統(tǒng)就需要和各個子系統(tǒng)

    2024年01月20日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包