欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析C#中的AsnycLocal與ThreadLocal

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

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

  • AsyncLocal變量可以在父子線程中傳遞,創(chuàng)建子線程時父線程會將自己的AsyncLocal類型的上下文變量賦值到子線程中,但是,當(dāng)子線程改變線程上下文中AsnycLocal變量值后,父線程不會同步改變。也就是說AsnycLocal變量只會影響他的子線程,不會影響他的父級線程。
  • TreadLocal只是當(dāng)前線程的上下文變量,不能在父子線程間同步。
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

從結(jié)果上可以看出一下結(jié)論:

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

總結(jié)

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

相關(guān)文章

  • C#使用Socket發(fā)送和接收TCP數(shù)據(jù)實例

    C#使用Socket發(fā)送和接收TCP數(shù)據(jù)實例

    這篇文章主要介紹了C#使用Socket發(fā)送和接收TCP數(shù)據(jù)的實現(xiàn)方法,以實例的形式詳細(xì)講述了C#實現(xiàn)socket通信的完整實現(xiàn)過程,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • 最新評論