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

淺析C#中的AsnycLocal與ThreadLocal

 更新時間:2021年09月30日 14:16:07   作者:沉默的雪糕  
這篇文章主要給大家介紹了關于C#中AsnycLocal與ThreadLocal的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

AsnyncLocal與ThreadLocal都是存儲線程上下文的變量,但是,在實際使用過程中兩者又有區(qū)別主要的表現在:

  • AsyncLocal變量可以在父子線程中傳遞,創(chuàng)建子線程時父線程會將自己的AsyncLocal類型的上下文變量賦值到子線程中,但是,當子線程改變線程上下文中AsnycLocal變量值后,父線程不會同步改變。也就是說AsnycLocal變量只會影響他的子線程,不會影響他的父級線程。
  • TreadLocal只是當前線程的上下文變量,不能在父子線程間同步。
using System;
using System.Threading;
using System.Threading.Tasks;

namespace await_aysnc
{
    class Program
    {
        static ThreadLocal<int> ThreadObj = new ThreadLocal<int>();
        static AsyncLocal<int> AsyncObj = new AsyncLocal<int>();

        static void Main(string[] args)
        {
            AsyncObj.Value = 1;
            ThreadObj.Value = 1;
            Console.WriteLine($"Task執(zhí)行前:AsyncObj= {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}");
            Task.Run(async() =>
            {
                Console.WriteLine($"RunAsync異步執(zhí)行前:AsyncObj= {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}");
                await RunAsync();
                Console.WriteLine($"RunAsync異步執(zhí)行后:AsyncObj = {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}");
            });
            Console.WriteLine($"Task執(zhí)行后:AsyncObj= {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}");
            Console.Read();
        }

        static async Task RunAsync()
        {           
            Console.WriteLine($"Delay異步執(zhí)行前:AsyncObj = {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId} ");
            AsyncObj.Value = 2;
            ThreadObj.Value = 2;
            await Task.Delay(100);
            Console.WriteLine($"Delay異步執(zhí)行后:AsyncObj = {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}");
        }
    }

}

Task執(zhí)行前:AsyncObj= 1 ThreadObj= 1 ThreeadId = 1
Task執(zhí)行后:AsyncObj= 1 ThreadObj= 1 ThreeadId = 1
RunAsync異步執(zhí)行前:AsyncObj= 1 ThreadObj= 0 ThreeadId = 3
Delay異步執(zhí)行前:AsyncObj = 1 ThreadObj= 0 ThreeadId = 3
Delay異步執(zhí)行后:AsyncObj = 2 ThreadObj= 0 ThreeadId = 4
RunAsync異步執(zhí)行后:AsyncObj = 1 ThreadObj= 0 ThreeadId = 4

從結果上可以看出一下結論:

  • RunAsync執(zhí)行前ThreadLocal值被切成0即ThreadLocal變量在新線程里面沒有繼承主線程的上下文變量,但是AsyncLocal繼承了。
  • Delay返回后,線程id變了,同時,TheadLocal中的變量為0。
  • RunAsync結束后AyncLocal又切回主線程的上下文值,,同樣Threadlocal中的值丟失。
  • 由于await執(zhí)行完返回之后,.net會在線程池中隨機選取一個線程來執(zhí)行await之后的邏輯,所以,await之后同時也會有一定幾率獲取到之前的線程,如果出現這種情形,TreadLocal會獲取到之前的上下文,此時會出現意料之外的問題,從現象上看報錯可能會是一個概率性問題。

總結

到此這篇關于C#中AsnycLocal與ThreadLocal的文章就介紹到這了,更多相關C#的AsnycLocal與ThreadLocal內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • WinForm防止程序重復運行的方法分析

    WinForm防止程序重復運行的方法分析

    這篇文章主要介紹了WinForm防止程序重復運行的方法,通過記錄窗口句柄實現防止WinForm程序重復運行的功能,需要的朋友可以參考下
    2017-05-05
  • .net的命名空間類庫的簡單介紹

    .net的命名空間類庫的簡單介紹

    .net的命名空間類庫的簡單介紹,需要的朋友可以參考一下
    2013-04-04
  • C#調用Python的URL接口的示例

    C#調用Python的URL接口的示例

    這篇文章主要介紹了C#調用Python的URL接口的示例,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下
    2020-10-10
  • Unity工具類ScrollView實現拖拽滑動翻頁

    Unity工具類ScrollView實現拖拽滑動翻頁

    這篇文章主要為大家詳細介紹了Unity工具類ScrollView實現拖拽滑動翻頁,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C# 監(jiān)控 Windows 文件夾的方法

    C# 監(jiān)控 Windows 文件夾的方法

    這篇文章主要介紹了C# 監(jiān)控 Windows 文件夾的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C#提高編程能力的50個要點總結

    C#提高編程能力的50個要點總結

    這篇文章主要介紹了C#提高編程能力的50個要點,較為詳細的總結分析了C#程序設計中常見的注意事項與編程技巧,需要的朋友可以參考下
    2016-02-02
  • C#多線程傳遞參數及任務用法示例

    C#多線程傳遞參數及任務用法示例

    這篇文章主要介紹了C#多線程傳遞參數及任務用法,結合簡單實例形式分析了C#多線程的使用及相關的參數傳遞與任務創(chuàng)建等使用技巧,需要的朋友可以參考下
    2016-06-06
  • UGUI實現4位驗證碼輸入

    UGUI實現4位驗證碼輸入

    這篇文章主要為大家詳細介紹了UGUI實現4位驗證碼輸入,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 關于javascript冒泡與默認事件的使用詳解

    關于javascript冒泡與默認事件的使用詳解

    本篇文章是對javascript中冒泡與默認事件的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • c# 實現發(fā)送郵件的功能

    c# 實現發(fā)送郵件的功能

    這篇文章主要介紹了c# 如何實現發(fā)送郵件的功能,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07

最新評論

府谷县| 宜兴市| 六枝特区| 南部县| 宁安市| 隆林| 云阳县| 海兴县| 青阳县| 全椒县| 南康市| 南平市| 滕州市| 麻栗坡县| 兴国县| 关岭| 古丈县| 汉沽区| 炉霍县| 霍邱县| 临泽县| 墨脱县| 尉犁县| 青州市| 阳信县| 滕州市| 大新县| 花莲市| 呼玛县| 甘孜县| 襄城县| 贵阳市| 吐鲁番市| 九龙县| 余干县| 永泰县| 宝山区| 多伦县| 杭锦旗| 沂源县| 新竹市|