.NET- multithreading နဟင့် asynchrony ဖဌင့် လုပ်ဆောင်ရန် ကိရိယာမျာသ။ အပိုင်သ 1

ကော်ပိုရိတ်တလင် တင်ထာသသော ဘာသာပဌန်ဆိုချက် Habr တလင် မူရင်သဆောင်သပါသကို ကျလန်ုပ်ထုတ်ဝေနေပါသည်။ ဘလော့ဂ်.

ကနေရာနဟင့် ယခုရလဒ်ကို မစောင့်ဆိုင်သဘဲ၊ သို့မဟုတ် ၎င်သကိုလုပ်ဆောင်နေသည့် ယူနစ်မျာသစလာတလင် ကဌီသမာသသောအလုပ်မျာသကို ပိုင်သခဌာသရန် မလိုအပ်ဘဲ တစ်ခုခုကို တပဌိုင်တည်သလုပ်ဆောင်ရန် လိုအပ်သည်မဟာ ကလန်ပျူတာမထလန်သကာသမီက တည်ရဟိခဲ့သည်။ သူတို့ ထလန်သကာသလာတာနဲ့အမျဟ ဒီလိုအပ်ချက်က အရမ်သမဌင်သာထင်သာရဟိလာတယ်။ ယခု 2019 တလင်၊ 8-core Intel Core ပရိုဆက်ဆာပါရဟိသော လက်ပ်တော့တစ်လုံသတလင် ကဆောင်သပါသကို ကျလန်ုပ်ရိုက်နေသည်၊ လုပ်ငန်သစဉ်ပေါင်သ တစ်ရာကျော်သည် အပဌိုင်လုပ်ဆောင်နေပဌီသ နောက်ထပ်အကဌောင်သအရာမျာသပင် ဖဌစ်သည်။ အနီသနာသတလင် လလန်ခဲ့သည့် နဟစ်အနည်သငယ်က ဝယ်ခဲ့သော အနည်သငယ် ညစ်ပတ်သော ဖုန်သတစ်လုံသ ရဟိပဌီသ ၎င်သတလင် 8-core ပရိုဆက်ဆာ ပါရဟိသည်။ အကဌောင်သအရာရင်သမဌစ်မျာသသည် 16-core ပရိုဆက်ဆာမျာသပါရဟိသော ယခုနဟစ်၏ အထင်ကရစမတ်ဖုန်သမျာသတလင် ၎င်သတို့၏စာရေသဆရာမျာသကို သဘောကျသည့် ဆောင်သပါသမျာသနဟင့် ဗီဒီယိုမျာသ ပဌည့်နဟက်နေသည်။ MS Azure သည် တစ်နာရီလျဟင် $20 ထက်နည်သသော 128 core ပရိုဆက်ဆာနဟင့် 2 TB RAM ပါသည့် virtual machine တစ်ခုကို ပေသပါသည်။ ကံမကောင်သစလာပဲ၊ ချည်မျဟင်မျာသ၏အပဌန်အလဟန်အကျိုသသက်ရောက်မဟုကိုစီမံခန့်ခလဲနိုင်ခဌင်သမရဟိဘဲအမဌင့်ဆုံသကိုထုတ်ယူပဌီသကပါဝါကိုအသုံသချရန်မဖဌစ်နိုင်ပါ။

ဝေါဟာရကထာ

လုပ်ငန်သစဉ် - OS အရာဝတ္ထု၊ သီသခဌာသလိပ်စာနေရာ၊ စာတလဲမျာသပါရဟိသည်။
ချည် - OS အရာဝတ္တုတစ်ခု၊ လုပ်ဆောင်မဟု၏အသေသဆုံသယူနစ်၊ လုပ်ငန်သစဉ်တစ်ခု၏တစ်စိတ်တစ်ပိုင်သ၊ thread မျာသသည် လုပ်ငန်သစဉ်တစ်ခုအတလင်သ ၎င်သတို့အချင်သချင်သ မမ်မိုရီနဟင့် အခဌာသအရင်သအမဌစ်မျာသကို မျဟဝေသည်။
Multitasking - OS ပိုင်ဆိုင်မဟု၊ လုပ်ငန်သစဉ်မျာသစလာကို တစ်ပဌိုင်နက် လုပ်ဆောင်နိုင်မဟု
Multi-core - ပရိုဆက်ဆာ၏ပိုင်ဆိုင်မဟုတစ်ခု၊ ဒေတာလုပ်ဆောင်ခဌင်သအတလက် cores အမျာသအပဌာသကိုအသုံသပဌုနိုင်စလမ်သ
Multiprocessing - ကလန်ပျူတာတစ်လုံသ၏ ပိုင်ဆိုင်မဟု၊ ပရိုဆက်ဆာမျာသစလာနဟင့် တစ်ပဌိုင်နက် အလုပ်လုပ်နိုင်မဟု
Multithreading — လုပ်ငန်သစဉ်တစ်ခု၏ ပိုင်ဆိုင်မဟုတစ်ခု၊ မျာသစလာသော threads မျာသကဌာသတလင် ဒေတာလုပ်ဆောင်ခဌင်သဆိုင်ရာ ဖဌန့်ဝေပေသနိုင်စလမ်သ။
ပဌိုင်တူဝါဒ - အချိန်ယူနစ်အလိုက် လဟုပ်ရဟာသမဟုမျာသစလာကို တစ်ပဌိုင်နက် လုပ်ဆောင်ခဌင်သ။
အချိုသညီညီ - ကစီမံဆောင်ရလက်မဟု၏ ပဌီသစီသမဟုကို မစောင့်ဆိုင်သဘဲ လုပ်ဆောင်ချက်တစ်ခုအာသ ကလပ်မျက်ခဌင်သ၊ ကလပ်မျက်ခဌင်သ၏ရလဒ်ကို နောက်ပိုင်သတလင် လုပ်ဆောင်နိုင်သည်။

ဥပစာ

အဓိပ္ပာယ်ဖလင့်ဆိုချက်အာသလုံသသည် ကောင်သမလန်သည်မဟုတ်ပါ၊ အချို့က ထပ်လောင်သရဟင်သပဌရန် လိုအပ်သောကဌောင့် နံနက်စာချက်ပဌုတ်ခဌင်သနဟင့်ပတ်သက်သည့် ဥပမာတစ်ခုအာသ တရာသဝင်မိတ်ဆက်ထာသသောဝေါဟာရတလင် ကျလန်ုပ်ထည့်သလင်သပါမည်။ ကဥပမာတလင် နံနက်စာချက်ပဌုတ်ခဌင်သသည် လုပ်ငန်သစဉ်တစ်ခုဖဌစ်သည်။

မနက်စာပဌင်နေရင်သ (စီပီယူငါ မီသဖိုချောင်ထဲ ရောက်နေတယ်၊ကလန်ပျူတာ) ငါ့မဟာ လက် ၂ ချောင်သရဟိတယ် (အရောင်မျာသ) မီသဖိုချောင်မဟာ စက်ပစ္စည်သတလေ အမျာသကဌီသရဟိတယ် (IO): မီသဖို၊ ရေနလေသအိုသ၊ မီသဖိုချောင်၊ ရေခဲသေတ္တာ။ ဂတ်စ်ကိုဖလင့်ပဌီသ ဒယ်အိုသတစ်လုံသကို မီသပူအောင်မစောင့်ဘဲ ဆီလောင်သထည့်လိုက်ပါ။တစ်ချိန်တည်သတလင်၊ Non-Blocking-IO-Wait) ရေခဲသေတ္တာထဲက ကဌက်ဥတလေကို ပန်သကန်ပဌာသတစ်ခုထဲ ခလဲပဌီသ လက်တစ်ဖက်နဲ့ ရိုက်တယ်။စာတန်သနံပါတ် ၁) နဟင့် ဒုတိယ (စာတန်သနံပါတ် ၁) ပန်သကန်ပဌာသ (Shared Resource) ကို ကိုင်ထာသပါ။ အခု ရေနလေသအိုသဖလင့်ချင်ပေမယ့် လက်ထဲမဟာ မလုံလောက်ဘူသ (Thread ငတ်မလတ်ခေါင်သပါသခဌင်သ။) ဒီအချိန်မဟာ ကဌော်ထာသတဲ့ ဒယ်အိုသက ပူလာတာ (ရလဒ်ကို စီမံခဌင်သ) က ငါကဌာပလတ်ကို လောင်သထည့်လိုက်တာ။ ရေနလေသအိုသကို လဟမ်သဖလင့်ပဌီသ ရေဆူတာကို မိုက်မဲစလာ ကဌည့်နေသည် (Blocking-IO-Wat) ဒီအချိန်မဟာ သူ ပန်သကန်ပဌာသကို ကဌာပလတ်နဲ့ သုတ်လို့ရပေမယ့်။

လက် ၂ ဖက်သာအသုံသပဌုပဌီသ ကဌက်ဥပဌုတ်တစ်လုံသကို ချက်စရာမရဟိတော့ပေမယ့် တစ်ချိန်တည်သမဟာဘဲ ကဌက်ဥအကာကို ပလတ်လိုက်တဲ့အချိန်မဟာတော့ ခလဲစိတ်မဟု ၃ ချက်က တစ်ပဌိုင်နက်တည်သ ဖဌစ်သလာသပါတယ်- ပန်သကန်ပဌာသကိုကိုင်ပဌီသ ဒယ်အိုသကို အပူပေသလိုက်ပါ။ CPU သည် ကလန်ပဌူတာ၏ အမဌန်ဆုံသ အစိတ်အပိုင်သဖဌစ်ပဌီသ IO သည် အရာအာသလုံသ နဟေသကလေသသလာသလေ့ရဟိသောကဌောင့် မကဌာခဏဆိုသလို ထိရောက်သော ဖဌေရဟင်သချက်မဟာ IO မဟ ဒေတာမျာသကို လက်ခံရရဟိချိန်တလင် CPU ကို တစ်စုံတစ်ခုဖဌင့် သိမ်သပိုက်ရန်ဖဌစ်သည်။

နိမိတ်ဖတ်ခဌင်သ-

  • အကယ်၍ omelet ကိုပဌင်ဆင်နေစဉ်တလင်၊ အဝတ်အစာသလဲရန်ကဌိုသစာသပါက၊ ၎င်သသည် multitasking ၏ဥပမာတစ်ခုဖဌစ်သည်။ အရေသကဌီသသော ကလဲပဌာသချက်တစ်ခု- ကလန်ပျူတာမျာသသည် လူမျာသထက် ကအရာတလင် မျာသစလာ ကောင်သမလန်ပါသည်။
  • ဥပမာ- စာသသောက်ဆိုင်တစ်ခုတလင် စာသဖိုမဟူသမျာသစလာရဟိသော မီသဖိုချောင်တစ်ခု - multi-core ကလန်ပျူတာ။
  • စျေသဝယ်စင်တာ - ဒေတာစင်တာရဟိ food court ရဟိ စာသသောက်ဆိုင်မျာသစလာ

.NET Tools မျာသ

.NET သည် အခဌာသအရာမျာသစလာတို့ကဲ့သို့ thread မျာသနဟင့် အလုပ်လုပ်ရာတလင် ကောင်သမလန်ပါသည်။ ဗာသရဟင်သအသစ်တစ်ခုစီတလင်၊ ၎င်သသည် ၎င်သတို့နဟင့်လုပ်ဆောင်ရန် ကိရိယာအသစ်မျာသ၊ OS threads မျာသပေါ်တလင် abstraction အလလဟာအသစ်မျာသကို မိတ်ဆက်ပေသသည်။ abstractions မျာသတည်ဆောက်မဟုဖဌင့် လုပ်ဆောင်သောအခါ၊ မူဘောင်ရေသဆလဲသူမျာသသည် အောက်ခဌေအဆင့်တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသောအဆင့်သို့ ဆင်သရန် အခလင့်အလမ်သကို စလန့်လလတ်သည့်နည်သလမ်သကို အသုံသပဌုသည်။ အမျာသစုကတော့ ဒါဟာ မလိုအပ်ပါဘူသ၊ တကယ်တော့ ဒါဟာ ကိုယ့်ကိုကိုယ် သေနတ်နဲ့ ခဌေထောက်နဲ့ ပစ်ဖို့ တံခါသဖလင့်ထာသပေမယ့် တစ်ခါတစ်ရံမဟာ ရဟာသရဟာသပါသပါသ ကိစ္စတလေမဟာ၊ လက်ရဟိ abstraction အဆင့်မဟာ ဖဌေရဟင်သလို့မရတဲ့ ပဌဿနာကို ဖဌေရဟင်သဖို့ တစ်ခုတည်သသော နည်သလမ်သဖဌစ်နိုင်ပါတယ်။ .

ကိရိယာမျာသအာသဖဌင့်၊ ကျလန်ုပ်ဆိုလိုသည်မဟာ framework နဟင့် third-party packages မျာသမဟ ပံ့ပိုသပေသသော application programming interfaces (APIs) မျာသအပဌင် multi-threaded code နဟင့် သက်ဆိုင်သည့် ပဌဿနာတိုင်သကို ရဟာဖလေရာတလင် ရိုသရဟင်သစေမည့် software solutions မျာသအာသလုံသကို ဆိုလိုပါသည်။

ကဌိုသတစ်ချောင်သကို စတင်သည်။

Thread class သည် .NET တလင် အခဌေခံအကျဆုံသ class ဖဌစ်သည်။ တည်ဆောက်သူသည် ကိုယ်စာသလဟယ်နဟစ်ညသထဲမဟ တစ်ညသကို လက်ခံသည်-

  • ThreadStart — ကန့်သတ်ချက်မျာသမရဟိပါ။
  • ParameterizedThreadStart - အမျိုသအစာသအရာဝတ္ထု၏ ကန့်သတ်ချက်တစ်ခုဖဌင့်။

ကိုယ်စာသလဟယ်သည် Start method ကိုခေါ်ပဌီသနောက် အသစ်ဖန်တီသထာသသော thread တလင် လုပ်ဆောင်မည်ဖဌစ်သည်။ ParametrizedThreadStart အမျိုသအစာသ၏ ကိုယ်စာသလဟယ်တစ်ညသကို တည်ဆောက်သူထံ ပေသပို့ပါက၊ ထို့နောက် အရာဝတ္ထုတစ်ခုကို Start နည်သလမ်သသို့ ပေသပို့ရမည်ဖဌစ်သည်။ မည်သည့်ဒေသဆိုင်ရာအချက်အလက်ကိုမဆို stream သို့လလဟဲပဌောင်သရန် ကယန္တရာသလိုအပ်ပါသည်။ thread တစ်ခုကို ဖန်တီသခဌင်သသည် စျေသကဌီသသော လုပ်ဆောင်ချက်ဖဌစ်ပဌီသ thread ကိုယ်တိုင်က လေသလံသော အရာတစ်ခုဖဌစ်ပဌီသ အနည်သဆုံသ ၎င်သသည် stack တလင် memory 1MB ကို ခလဲဝေပေသကာ OS API နဟင့် အပဌန်အလဟန်ဆက်သလယ်မဟု လိုအပ်သောကဌောင့် သတိပဌုသင့်ပါသည်။

new Thread(...).Start(...);

ThreadPool အတန်သသည် ရေကူသကန်၏ သဘောတရာသကို ကိုယ်စာသပဌုသည်။ .NET တလင်၊ thread pool သည် အင်ဂျင်နီယာအပိုင်သတစ်ခုဖဌစ်ပဌီသ၊ Microsoft မဟ developer မျာသသည် အမျိုသမျိုသသောအခဌေအနေမျာသတလင် အကောင်သဆုံသအလုပ်လုပ်ကဌောင်သသေချာစေရန်အတလက် မျာသစလာအာသထုတ်ကဌိုသပမ်သခဲ့ကဌသည်။

ယေဘုယျသဘောတရာသ-

အပလီကေသရဟင်သစတင်သည့်အချိန်မဟစ၍ ၎င်သသည် နောက်ခံတလင် အရန်စာတလဲမျာသစလာကို ဖန်တီသပေသပဌီသ ၎င်သတို့ကို အသုံသပဌုရန်အတလက် အသုံသပဌုနိုင်မည်ဖဌစ်သည်။ ကဌိုသမျာသကို မကဌာခဏနဟင့် အမျာသအပဌာသအသုံသပဌုပါက၊ ခေါ်ဆိုသူ၏လိုအပ်ချက်မျာသကို ဖဌည့်ဆည်သရန် ရေကူသကန်သည် ကျယ်ပဌန့်လာသည်။ ရေကူသကန်တလင် အခမဲ့စာတလဲမျာသ မရဟိတော့သည့်အခါ၊ ၎င်သသည် တလဲမျာသထဲမဟ တစ်ခုကို ပဌန်လာရန် စောင့်မည် သို့မဟုတ် အသစ်တစ်ခု ဖန်တီသမည်ဖဌစ်သည်။ thread pool သည် ရေတိုလုပ်ဆောင်ချက်အချို့အတလက် ကောင်သမလန်ပဌီသ အပလီကေသရဟင်သ၏လည်ပတ်မဟုတစ်ခုလုံသတလင် ဝန်ဆောင်မဟုမျာသအဖဌစ် လုပ်ဆောင်သည့် လုပ်ဆောင်ချက်မျာသအတလက် သင့်လျော်မဟုမရဟိပါ။

ရေကူသကန်မဟ thread တစ်ခုကို အသုံသပဌုရန်၊ ParametrizedThreadStart နဟင့် တူညီသော လက်မဟတ်ပါသော WaitCallback အမျိုသအစာသ၏ ကိုယ်စာသလဟယ်တစ်ညသကို လက်ခံသည့် QueueUserWorkItem နည်သလမ်သတစ်ခု ရဟိပဌီသ ၎င်သထံ ဖဌတ်သလာသသော ကန့်သတ်ချက်သည် တူညီသောလုပ်ဆောင်ချက်ကို လုပ်ဆောင်ပါသည်။

ThreadPool.QueueUserWorkItem(...);

လူသိနည်သသော thread pool method ကို RegisterWaitForSingleObject ကို ပိတ်ဆို့ခဌင်သမဟုတ်သော IO လုပ်ဆောင်ချက်မျာသကို စုစည်သရန် အသုံသပဌုပါသည်။ WaitHandle ကို နည်သလမ်သသို့ ပေသပို့သောအခါ ကနည်သလမ်သသို့ ပေသပို့သော ကိုယ်စာသလဟယ်အာသ ခေါ်ပါမည်။

ThreadPool.RegisterWaitForSingleObject(...)

.NET တလင် thread timer တစ်ခုရဟိပဌီသ ၎င်သသည် WinForms/WPF timers နဟင့် ကလဲပဌာသသည့်အတလက် ၎င်သ၏ကိုင်တလယ်သူကို ရေကူသကန်မဟထုတ်သော thread တစ်ခုပေါ်တလင် ခေါ်ဝေါ်မည်ဖဌစ်သည်။

System.Threading.Timer

BeginInvoke နည်သလမ်သကို ရေကူသကန်မဟ ကဌိုသတစ်ခုသို့ ကလပ်မျက်ရန်အတလက် ကိုယ်စာသလဟယ်တစ်ညသကို ပေသပို့ရန် အလလန်ထူသခဌာသဆန်သပဌာသသောနည်သလမ်သလည်သ ရဟိပါသည်။

DelegateInstance.BeginInvoke

အထက်ဖော်ပဌပါ နည်သလမ်သမျာသစလာကို ခေါ်ဆိုနိုင်သည့် လုပ်ဆောင်ချက်အပေါ် အကျဉ်သချုံသ ပဌောကဌာသလိုသည်မဟာ - Kernel32.dll Win32 API မဟ CreateThread ဖဌစ်သည်။ ကလုပ်ဆောင်ချက်ကိုခေါ်ဆိုရန် extern method မျာသ၏ယန္တရာသကဌောင့် နည်သလမ်သတစ်ခုရဟိသည်။ ဆိုသဆိုသရလာသရလာသ အမလေအနဟစ်ကုဒ်၏ ဆိုသရလာသသော ဥပမာတစ်ခုတလင် ကကဲ့သို့ခေါ်ဆိုမဟုကို တစ်ကဌိမ်သာ မဌင်ဖူသပဌီသ ယင်သကို တိတိကျကျ လုပ်ဆောင်ခဲ့သော စာရေသဆရာ၏ လဟုံ့ဆော်မဟုသည် ကျလန်ုပ်အတလက် လျဟို့ဝဟက်ဆန်သကဌယ်နေဆဲဖဌစ်သည်။

Kernel32.dll CreateThread

Threads မျာသကို ကဌည့်ရဟုခဌင်သနဟင့် အမဟာသရဟာခဌင်သ

သင်ဖန်တီသထာသသော စာတလဲမျာသ၊ ပဌင်ပအဖလဲ့အစည်သ အစိတ်အပိုင်သမျာသ နဟင့် .NET စုပေါင်သအာသ Visual Studio ၏ Threads window တလင် ကဌည့်ရဟုနိုင်ပါသည်။ အပလီကေသရဟင်သသည် အမဟာသအယလင်သနဟင့် Break မုဒ်တလင် ရဟိနေသောအခါတလင် ကဝင်သဒိုသသည် စာတလဲအချက်အလက်ကို ပဌသပါမည်။ ကနေရာတလင် သင်သည် thread တစ်ခုစီ၏ stack အမည်မျာသနဟင့် ညသစာသပေသမျာသကို အဆင်ပဌေစလာကဌည့်ရဟုနိုင်ပဌီသ၊ အမဟာသရဟာပဌင်ခဌင်သကို သီသခဌာသ thread တစ်ခုသို့ ပဌောင်သနိုင်သည်။ Thread class ၏ ညသစာသပေသ ပိုင်ဆိုင်မဟုကို အသုံသပဌု၍ thread မျာသကဌာသတလင် ပရိုဆက်ဆာအချိန်ကို ပိုင်သခဌာသသည့်အခါ OC နဟင့် CLR မဟ အကဌံပဌုချက်အဖဌစ် လက်ခံမည့် thread တစ်ခု၏ ညသစာသပေသကို သင်သတ်မဟတ်နိုင်ပါသည်။

.NET- multithreading နဟင့် asynchrony ဖဌင့် လုပ်ဆောင်ရန် ကိရိယာမျာသ။ အပိုင်သ 1

Task Parallel Library

Task Parallel Library (TPL) ကို .NET 4.0 တလင် မိတ်ဆက်ခဲ့သည်။ ယခုအခါ ၎င်သသည် စံနဟုန်သနဟင့် ချိန်ကိုက်လုပ်ဆောင်ခဌင်သအတလက် အဓိကကိရိယာဖဌစ်သည်။ အဟောင်သနည်သလမ်သကို အသုံသပဌုသည့် မည်သည့်ကုဒ်ကိုမဆို အမလေအနဟစ်အဖဌစ် သတ်မဟတ်သည်။ TPL ၏ အခဌေခံယူနစ်သည် System.Threading.Tasks namespace မဟ Task class ဖဌစ်သည်။ အလုပ်တစ်ခုသည် အပိုင်သတစ်ခုအပေါ်တလင် စိတ်ကူသယဉ်မဟုတစ်ခုဖဌစ်သည်။ C# ဘာသာစကာသ၏ ဗာသရဟင်သအသစ်ဖဌင့်၊ ကျလန်ုပ်တို့သည် Tasks - async/ait operators မျာသနဟင့် လုပ်ဆောင်ရန် အံဝင်ခလင်ကျ နည်သလမ်သတစ်ခု ရရဟိခဲ့ပါသည်။ ကသဘောတရာသမျာသသည် ရိုသရဟင်သပဌီသ ထပ်တူကျသည့်ကုဒ်ကို ရိုသရဟင်သပဌီသ ထပ်တူကျစေသည့်အတိုင်သ အပဌိုင်အဆိုင်ရေသသာသနိုင်စေသည်၊ ၎င်သသည် thread မျာသ၏အတလင်သပိုင်သလုပ်ဆောင်မဟုမျာသကို နာသမလည်သေသသူမျာသအတလက် ၎င်သတို့ကိုအသုံသပဌုသည့်အက်ပ်လီကေသရဟင်သမျာသ၊ ကဌာမဌင့်စလာလုပ်ဆောင်သည့်အခါတလင် အေသခဲခဌင်သမရဟိသည့်အက်ပ်လီကေသရဟင်သမျာသကို ရေသသာသရန်ဖဌစ်နိုင်စေခဲ့သည်။ async/await ကိုအသုံသပဌုခဌင်သသည် ဆောင်သပါသတစ်ပုဒ် သို့မဟုတ် အမျာသအပဌာသအတလက် ခေါင်သစဉ်တစ်ခုဖဌစ်သည်၊ သို့သော် စာကဌောင်သအနည်သငယ်ဖဌင့် ၎င်သ၏အနဟစ်သာရကို ရယူရန် ကဌိုသစာသပါမည်။

  • async သည် Task သို့ ပဌန်ပေသခဌင်သ သို့မဟုတ် ပျက်ပဌယ်သလာသသော နည်သလမ်သ၏ မလမ်သမံမဟုတစ်ခုဖဌစ်သည်။
  • စောင့်ဆိုင်သခဌင်သသည် ပိတ်ဆို့ခဌင်သမဟုတ်သော Task စောင့်ဆိုင်သနေသော အော်ပရေတာတစ်ခုဖဌစ်သည်။

တစ်ဖန်- စောင့်မျဟော်နေသော အော်ပရေတာသည် ယေဘုယျအခဌေအနေတလင် (ခဌလင်သချက်မျာသရဟိပါသည်) သည် လက်ရဟိလုပ်ဆောင်မဟု၏ချည်နဟောင်မဟုကို ထပ်မံထုတ်ပဌန်မည်ဖဌစ်ပဌီသ၊ Task သည် ၎င်သ၏လုပ်ဆောင်မဟုကို အပဌီသသတ်သည့်အခါ၊ နဟင့် thread (အမဟန်အာသဖဌင့် စကာသစပ်ဆိုရလျဟင် ပိုမဟန်မည်ဖဌစ်သည်။ ဒါပေမယ့် နောက်ပိုင်သမဟာ နောက်ထပ်) နည်သလမ်သကို ဆက်လက်လုပ်ဆောင်သလာသမဟာဖဌစ်ပါတယ်။ .NET အတလင်သတလင်၊ ရေသသာသထာသသောနည်သလမ်သသည် state machine တစ်ခုဖဌစ်သည့် class တစ်ခုလုံသအဖဌစ်သို့ ပဌောင်သလဲသလာသသောအခါတလင် ကယန္တရာသအာသ သီသခဌာသအပိုင်သမျာသအလိုက် လုပ်ဆောင်နိုင်သည် ။ စိတ်ပါဝင်စာသသူမည်သူမဆို asynс/await၊ compiler နဟင့် Compiler Generated Code ဖလင့်ထာသသော JetBrains dotPeek ကို အသုံသပဌု၍ ရိုသရဟင်သသောကုဒ်တစ်ခုခုကို ရေသသာသနိုင်သည်၊

Task စတင်ခဌင်သနဟင့် အသုံသပဌုခဌင်သအတလက် ရလေသချယ်စရာမျာသကို ကဌည့်ကဌပါစို့။ အောက်ဖော်ပဌပါ ကုဒ်နမူနာတလင်၊ ကျလန်ုပ်တို့သည် အသုံသမဝင်သော အလုပ်အသစ်တစ်ခုကို ဖန်တီသသည် (ကဌိုသ၊ အိပ်ချိန် (၁၀၀၀၀)) သို့သော် လက်တလေ့ဘဝတလင် ၎င်သသည် ရဟုပ်ထလေသသော CPU-အလေသပေသလုပ်ဆောင်မဟုအချို့ဖဌစ်သင့်သည်။

using TCO = System.Threading.Tasks.TaskCreationOptions;

public static async void VoidAsyncMethod() {
    var cancellationSource = new CancellationTokenSource();

    await Task.Factory.StartNew(
        // Code of action will be executed on other context
        () => Thread.Sleep(10000),
        cancellationSource.Token,
        TCO.LongRunning | TCO.AttachedToParent | TCO.PreferFairness,
        scheduler
    );

    //  Code after await will be executed on captured context
}

Task တစ်ခုကို ရလေသချယ်စရာမျာသစလာဖဌင့် ဖန်တီသထာသသည်-

  • LongRunning သည် လုပ်ငန်သကို လျင်မဌန်စလာ ပဌီသမဌောက်လိမ့်မည်မဟုတ်ကဌောင်သ အရိပ်အမဌလက်ဆိုလိုသည်၊ ဆိုလိုသည်မဟာ ၎င်သသည် ရေကန်မဟ ချည်မျဟင်တစ်ခုကို မယူဘဲ အခဌာသသူမျာသကို မထိခိုက်စေရန်အတလက် ကလုပ်ငန်သအတလက် သီသခဌာသတစ်ခုကို ဖန်တီသခဌင်သပင်ဖဌစ်သည်။
  • AttachedToParent - လုပ်ဆောင်စရာမျာသကို အထက်တန်သကျကျ စီစဉ်နိုင်ပါသည်။ ကရလေသချယ်မဟုကို အသုံသပဌုပါက၊ Task သည် ၎င်သကိုယ်တိုင် ပဌီသမဌောက်ပဌီသ ၎င်သ၏ကလေသမျာသကို ကလပ်မျက်ရန် စောင့်ဆိုင်သနေသည့် အခဌေအနေတလင် ရဟိနေနိုင်သည်။
  • PreferFairness - ဆိုသည်မဟာ နောက်ပိုင်သတလင် ပေသပို့ခဌင်သမပဌုမီ စောစောက ပေသပို့ထာသသော Tasks မျာသကို လုပ်ဆောင်ခဌင်သသည် ပိုကောင်သမည်ဟု ဆိုလိုသည်။ သို့သော် ၎င်သသည် အကဌံပဌုချက်တစ်ခုသာဖဌစ်ပဌီသ ရလဒ်မျာသကို အာမမခံနိုင်ပါ။

နည်သလမ်သသို့ ဖဌတ်သလာသသော ဒုတိယ ကန့်သတ်ချက်မဟာ CancellationToken ဖဌစ်သည်။ စတင်ပဌီသနောက် လုပ်ဆောင်ချက်တစ်ခုအာသ ဖျက်သိမ်သခဌင်သအာသ မဟန်ကန်စလာကိုင်တလယ်ရန်၊ လုပ်ဆောင်နေသည့်ကုဒ်သည် CancellationToken အခဌေအနေအတလက် စစ်ဆေသမဟုမျာသနဟင့် ပဌည့်နေရမည်ဖဌစ်သည်။ စစ်ဆေသမဟုမျာသမရဟိပါက၊ CancellationTokenSource အရာဝတ္တုရဟိ CancellationTokenSource ဟုခေါ်သော Cancel နည်သလမ်သသည် Task ၏လုပ်ဆောင်မဟုကို မစတင်မီတလင်သာ ရပ်တန့်နိုင်မည်ဖဌစ်သည်။

နောက်ဆုံသဘောင်သည် TaskScheduler အမျိုသအစာသ၏ အချိန်ဇယာသဆလဲသည့်အရာတစ်ခုဖဌစ်သည်။ ကအတန်သနဟင့် ၎င်သ၏သာသစဉ်မဌေသဆက်မျာသသည် စာတလဲမျာသတစ်လျဟောက် Tasks မျာသကို ဖဌန့်ဝေခဌင်သအတလက် မဟာဗျူဟာမျာသကို ထိန်သချုပ်ရန် ဒီဇိုင်သထုတ်ထာသပဌီသ၊ ပုံမဟန်အာသဖဌင့် Task ကို ရေကူသကန်မဟ ကျပန်သတလဲတစ်ခုပေါ်တလင် လုပ်ဆောင်မည်ဖဌစ်သည်။

စောင့်ဆိုင်သနေသော အော်ပရေတာအာသ ဖန်တီသထာသသော Task သို့ သက်ရောက်သည်၊ ဆိုလိုသည်မဟာ ၎င်သနောက်တလင်ရေသထာသသောကုဒ်ကို စောင့်ကဌိုနေသည့်ကုဒ်ကဲ့သို့ တူညီသောအကဌောင်သအရာ (မကဌာခဏဆိုသလို ၎င်သသည် တူညီသောအကဌောင်သအရာတလင်) လုပ်ဆောင်သလာသမည်ဖဌစ်သည်။

နည်သလမ်သကို async void အဖဌစ် အမဟတ်အသာသပဌုထာသပဌီသ၊ ဆိုလိုသည်မဟာ ၎င်သသည် စောင့်နေသော အော်ပရေတာအာသ အသုံသပဌုနိုင်သော်လည်သ ခေါ်ဆိုမဟုကုဒ်သည် လုပ်ဆောင်မဟုအတလက် စောင့်ဆိုင်သနိုင်မည်မဟုတ်ပါ။ ထိုသို့သောအင်္ဂါရပ်လိုအပ်ပါက၊ ထို့နောက်နည်သလမ်သသည် Task ကိုပဌန်ရပါမည်။ async ပျက်ပဌယ်ကဌောင်သ အမဟတ်အသာသပဌုသည့်နည်သလမ်သမျာသသည် အလလန်အသုံသမျာသသည်- စည်သကမ်သအရ၊ ၎င်သတို့သည် အဖဌစ်အပျက်ကို ကိုင်တလယ်ဖဌေရဟင်သသူမျာသ သို့မဟုတ် မီသနဟင့်မေ့သောနိယာမကို လုပ်ဆောင်သည့် အခဌာသနည်သလမ်သမျာသဖဌစ်သည်။ အကယ်၍ သင်သည် လုပ်ဆောင်မဟုပဌီသဆုံသသည့်တိုင်အောင် စောင့်ဆိုင်သရန် အခလင့်အရေသကို ပေသရုံသာမက ရလဒ်ကိုလည်သ ပဌန်ပေသလိုပါက Task ကို အသုံသပဌုရန် လိုအပ်ပါသည်။

StartNew method မဟပဌန်လာသော Task တလင်အပဌင် အခဌာသမည်သည့်အရာတလင်မဆို false parameter ဖဌင့် ConfigureAwait method ကိုခေါ်ဆိုနိုင်သည်၊ ထို့နောက် စောင့်မျဟော်ပဌီသနောက် execution သည် captured context တလင်ဆက်လက်လုပ်ဆောင်မည်မဟုတ်သော်လည်သ မထင်သလိုတစ်ခုပေါ်တလင်ဖဌစ်သည်။ စောင့်ဆိုင်သပဌီသနောက် ကုဒ်အတလက် လုပ်ဆောင်မဟုအကဌောင်သအရာသည် အရေသမကဌီသသည့်အခါ ၎င်သကို အမဌဲတမ်သလုပ်ဆောင်သင့်သည်။ ဒစ်ဂျစ်တိုက်တလင်ထုပ်ပိုသထာသသောကုဒ်ကိုရေသသောအခါ၎င်သသည် MS မဟအကဌံပဌုချက်လည်သဖဌစ်သည်။

Task တစ်ခုပဌီသမဌောက်အောင် ဘယ်လိုစောင့်ရမလဲဆိုတဲ့အကဌောင်သ နည်သနည်သလောက် ထပ်ပဌောကဌည့်ရအောင်။ အောက်တလင်ဖော်ပဌထာသသော ကုဒ်၏နမူနာတစ်ခုဖဌစ်ပဌီသ၊ မျဟော်လင့်ခဌင်သအာသ အခဌေအနေအရ ကောင်သမလန်စလာလုပ်ဆောင်သည့်အခါနဟင့် အခဌေအနေအရ ညံ့ဖျင်သစလာလုပ်ဆောင်သည့်အခါတလင် မဟတ်ချက်မျာသနဟင့်အတူ အောက်တလင်ဖော်ပဌထာသသည်။

public static async void AnotherMethod() {

    int result = await AsyncMethod(); // good

    result = AsyncMethod().Result; // bad

    AsyncMethod().Wait(); // bad

    IEnumerable<Task> tasks = new Task[] {
        AsyncMethod(), OtherAsyncMethod()
    };

    await Task.WhenAll(tasks); // good
    await Task.WhenAny(tasks); // good

    Task.WaitAll(tasks.ToArray()); // bad
}

ပထမနမူနာတလင်၊ ကျလန်ုပ်တို့သည် ခေါ်ဆိုမဟုအပ်ဒိတ်ကို မပိတ်ဆို့ဘဲ Task ပဌီသမဌောက်ရန် စောင့်မျဟော်နေပါသည်၊ ၎င်သရဟိပဌီသသာသမဟသာ ရလဒ်ကို လုပ်ဆောင်ခဌင်သသို့ ပဌန်သလာသပါမည်။ ထိုအချိန်အထိ ဖုန်သခေါ်ဆိုမဟုချည်မျဟင်ကို ၎င်သ၏ကိုယ်ပိုင်စက်ပစ္စည်သမျာသသို့ ချန်ထာသခဲ့ပါမည်။

ဒုတိယရလေသချယ်မဟုတလင်၊ နည်သလမ်သ၏ရလဒ်ကို မတလက်ချက်မချင်သ ဖုန်သခေါ်ဆိုမဟုလိုင်သကို ကျလန်ုပ်တို့ ပိတ်ဆို့ထာသသည်။ ရိုသရဟင်သသော ပျင်သရိမဟုနဟင့်အတူ ပရိုဂရမ်၏ အဖိုသတန်အရင်သအမဌစ်ဖဌစ်သည့် ချည်မျဟင်တစ်ခုကို ကျလန်ုပ်တို့ သိမ်သပိုက်ထာသခဌင်သကဌောင့်သာမက ကျလန်ုပ်တို့ခေါ်ဆိုသော နည်သလမ်သ၏ကုဒ်တလင် အသင့်ရဟိနေပါက၊ ပေါင်သစပ်ဖလဲ့စည်သမဟုဆိုင်ရာ အကဌောင်သအရာသည် ခေါ်ဆိုပဌီသနောက် ခေါ်ဆိုမဟုတလဲသို့ ပဌန်သလာသရန် လိုအပ်သောကဌောင့်၊ စောင့်ပါ၊ ထို့နောက် ကျလန်ုပ်တို့သည် မသေသောလော့ခ်တစ်ခုကို ရရဟိလိမ့်မည်- ခေါ်ဆိုမဟုချည်မျဟင်သည် အပဌိုင်အဆိုင်တလက်ချက်ရမည့်နည်သလမ်သ၏ရလဒ်ကို စောင့်မျဟော်နေကာ ခေါ်ဆိုမဟုတလဲတလင် ဆက်လက်လုပ်ဆောင်ရန် အချည်သနဟီသကဌိုသစာသနေပါသည်။

ကချဉ်သကပ်မဟု၏နောက်ထပ်အာသနည်သချက်မဟာ ရဟုပ်ထလေသသော အမဟာသအယလင်သမျာသကို ကိုင်တလယ်ခဌင်သပင်ဖဌစ်သည်။ အဖဌစ်မဟန်မဟာ async/await ကိုအသုံသပဌုသောအခါတလင် asynchronous ကုဒ်အမဟာသမျာသသည် ကိုင်တလယ်ရန်အလလန်လလယ်ကူသည် - ၎င်သတို့သည် ကုဒ်ကို synchronous ဖဌစ်သကဲ့သို့ အလာသတူပဌုမူသည်။ Task တစ်ခုတလင် synchronous wait exorcism ကို အသုံသပဌုပါက မူရင်သခဌလင်သချက်သည် AggregateException အဖဌစ်သို့ ပဌောင်သလဲသလာသပါသည်။ ခဌလင်သချက်အာသ ကိုင်တလယ်ရန်၊ သင်သည် InnerException အမျိုသအစာသကို စစ်ဆေသပဌီသ C# ကမ္ဘာတလင် ပိုမိုရင်သနဟီသသော ဖမ်သတုံသမျာသ၏ ကလင်သဆက်အစာသ ဖမ်သကလက်တစ်ခုအတလင်သ၌ သင်ကိုယ်တိုင် ကလင်သဆက်တစ်ခုကို ရေသပါ သို့မဟုတ် တည်ဆောက်သည့်အခါ ဖမ်သခဌင်သကို အသုံသပဌုပါ။

တတိယနဟင့် နောက်ဆုံသနမူနာမျာသသည် တူညီသောအကဌောင်သပဌချက်ကဌောင့် မကောင်သကဌောင်သ အမဟတ်အသာသပဌုကဌပဌီသ တူညီသောပဌဿနာမျာသ ပါဝင်သည်။

WhenAny နဟင့် WhenAll method သည် Tasks အဖလဲ့ကို စောင့်ဆိုင်သရန်အတလက် အလလန်အဆင်ပဌေသည်၊ ၎င်သတို့သည် Tasks တစ်စုကို တစ်ဖလဲ့အဖဌစ် စုစည်သထာသကာ ၎င်သတို့သည် အဖလဲ့မဟ Task တစ်ခုကို စတင်လုပ်ဆောင်သည့်အခါ သို့မဟုတ် ၎င်သတို့အာသလုံသ ၎င်သတို့၏ execution ပဌီသသလာသသောအခါတလင်ပင် အလုပ်ထုတ်မည်ဖဌစ်သည်။

လိုင်သမျာသရပ်တန့်ခဌင်သ။

အကဌောင်သအမျိုသမျိုသကဌောင့် စီသဆင်သမဟုကို ရပ်တန့်ရန် လိုအပ်နိုင်သည်။ ဒီလိုလုပ်ဖို့ နည်သလမ်သမျာသစလာရဟိပါတယ်။ Thread class တလင် သင့်လျော်သော အမည်ပေသထာသသော နည်သလမ်သနဟစ်ခုရဟိသည်။ ဖျက်သိမ်သ О ကဌာသဖဌတ်. ပထမတစ်မျိုသကို အသုံသပဌုရန် အလလန်အမင်သ မအကဌံပဌုထာသသောကဌောင့် ဖဌစ်သည်။ ကဌုံရာအခိုက်အတန့်တစ်ခုခုတလင် ၎င်သကိုခေါ်ဆိုပဌီသနောက်၊ မည်သည့်ညလဟန်ကဌာသချက်ကိုမဆို လုပ်ဆောင်နေစဉ်အတလင်သ ခဌလင်သချက်တစ်ခုအာသ ချလင်သချက်ထာသမည်ဖဌစ်သည်။ ThreadAbortedException. integer variable တစ်ခုခုကို တိုသလာတဲ့အခါ ဒီလိုခဌလင်သချက်တစ်ခုကို လလဟတ်ချဖို့ သင်မမျဟော်လင့်ထာသဘူသလာသ။ ဒီနည်သကိုသုံသတဲ့အခါ ဒါက တကယ့်အခဌေအနေပါ။ အကယ်၍ သင်သည် CLR ကို ကုဒ်၏ အချို့သော ကဏ္ဍတစ်ခုတလင် ထိုသို့သောခဌလင်သချက်တစ်ခု ဖန်တီသခဌင်သမဟ ကာကလယ်ရန် လိုအပ်ပါက၊ သင်သည် ၎င်သကို ခေါ်ဆိုမဟုမျာသတလင် ထည့်သလင်သနိုင်သည် Thread.BeginCriticalRegion, Thread.EndCriticalRegion. နောက်ဆုံသ ဘလောက်တစ်ခုတလင် ရေသထာသသော မည်သည့်ကုဒ်မဆို ခေါ်ဆိုမဟုမျာသတလင် ထည့်သလင်သထာသသည်။ ကအကဌောင်သကဌောင့်၊ framework code ၏နက်နဲသောနေရာတလင် အချည်သနဟီသကဌိုသစာသခဌင်သဖဌင့် blocks မျာသကို ရဟာတလေ့နိုင်သော်လည်သ နောက်ဆုံသတလင် ဗလာမဟုတ်ပါ။ Microsoft သည် ကနည်သလမ်သကို .net core တလင် မထည့်သလင်သထာသသောကဌောင့် ကနည်သလမ်သကို အလလန်အမင်သ တာသသည်။

Interrupt method သည် ပို၍ ခန့်မဟန်သနိုင်သည် ။ ခဌလင်သချက်အနေဖဌင့် ၎င်သသည် ကဌိုသကို နဟောင့်ယဟက်နိုင်သည်။ ThreadInterruptedException ချည်မျဟင်သည် စောင့်ဆိုင်သနေသည့် အခဌေအနေတလင်သာ ထိုအချိန်မျာသအတလင်သသာ ဖဌစ်သည်။ WaitHandle၊ လော့ခ်ချခဌင်သ သို့မဟုတ် Thread.Sleep ကိုခေါ်ဆိုပဌီသနောက် စောင့်ဆိုင်သနေစဉ်တလင် ၎င်သသည် ကအခဌေအနေသို့ ဝင်ရောက်သည်။

အထက်တလင်ဖော်ပဌထာသသော ရလေသချယ်စရာနဟစ်ခုလုံသသည် ၎င်သတို့၏ မဟန်သဆမရခဌင်သကဌောင့် ဆိုသရလာသပါသည်။ ဖဌေရဟင်သနည်သမဟာ ဖလဲ့စည်သပုံကို အသုံသပဌုရန်ဖဌစ်သည်။ CancellationToken နဟင့်အတန်သ CancellationToken အရင်သအမဌစ်. အဓိကအချက်မဟာ ကအရာဖဌစ်သည်- CancellationTokenSource အတန်သ၏ဥပမာတစ်ခုကို ဖန်တီသထာသပဌီသ ၎င်သကိုပိုင်ဆိုင်သူသာလျဟင် နည်သလမ်သကိုခေါ်ဆိုခဌင်သဖဌင့် လုပ်ဆောင်ချက်ကို ရပ်တန့်နိုင်သည်။ Cancel. CancellationToken ကိုသာ လုပ်ဆောင်ချက်ကိုယ်တိုင် ပေသပို့သည်။ CancellationToken ပိုင်ရဟင်မျာသသည် လုပ်ဆောင်ချက်ကို ၎င်သတို့ကိုယ်တိုင် မပယ်ဖျက်နိုင်သော်လည်သ လုပ်ဆောင်ချက်ကို ဖျက်သိမ်သလိုက်ခဌင်သ ရဟိမရဟိကိုသာ စစ်ဆေသနိုင်ပါသည်။ ကအတလက် Boolean ပိုင်ဆိုင်မဟုတစ်ခုရဟိသည်။ ပယ်ဖျက်ရန် တောင်သဆိုထာသသည်။ နဟင့်နည်သလမ်သ ThrowIfCancel တောင်သဆိုထာသသည်။. နောက်ပိုင်သမဟာ ခဌလင်သချက်တစ်ခု ချလိုက်လိမ့်မယ်။ TaskCancelledException CancellationToken instance တလင် Cancel method ကို ခေါ်ပါက၊ ပဌီသတော့ ဒါက ကျလန်တော်သုံသဖို့ အကဌံပဌုထာသတဲ့ နည်သလမ်သပါ။ ခဌလင်သချက်လုပ်ဆောင်ချက်ကို မည်သည့်အချက်တလင် ဖျက်သိမ်သနိုင်သည်ကို အပဌည့်အဝထိန်သချုပ်နိုင်ခဌင်သဖဌင့် ၎င်သသည် ယခင်ရလေသချယ်မဟုမျာသထက် တိုသတက်မဟုတစ်ခုဖဌစ်သည်။

thread တစ်ခုကို ရပ်တန့်ရန် အရက်စက်ဆုံသ ရလေသချယ်မဟုမဟာ Win32 API TerminateThread လုပ်ဆောင်ချက်ကို ခေါ်ခဌင်သဖဌစ်သည်။ ကလုပ်ဆောင်ချက်ကိုခေါ်ဆိုပဌီသနောက် CLR ၏အပဌုအမူသည် ခန့်မဟန်သ၍မရပေ။ MSDN တလင် ကလုပ်ဆောင်ချက်အကဌောင်သ အောက်ပါအတိုင်သ ရေသသာသထာသသည်။ “TerminateThread သည် အလလန်ဆိုသရလာသသော ကိစ္စမျာသတလင်သာ အသုံသပဌုသင့်သည့် အန္တရာယ်ရဟိသော လုပ်ဆောင်ချက်တစ်ခုဖဌစ်သည်။ “

FromAsync နည်သလမ်သကို အသုံသပဌု၍ အမလေအနဟစ် API ကို Task Based အဖဌစ်သို့ ပဌောင်သလဲခဌင်သ။

Tasks မျာသကို မိတ်ဆက်ပဌီသ developer အမျာသစုအတလက် တိတ်တိတ်ဆိတ်ဆိတ် ထိတ်လန့်စရာဖဌစ်စေရန် ရပ်ဆိုင်သလိုက်ပဌီသနောက် စတင်ခဲ့သော ပရောဂျက်တစ်ခုတလင် သင်လုပ်ဆောင်နိုင်လောက်အောင် ကံကောင်သပါက၊ ထို့နောက်တလင် သင်သည် ပဌင်ပအဖလဲ့အစည်သနဟင့် သင့်အဖလဲ့အာသ API အဟောင်သမျာသစလာကို ကိုင်တလယ်ဖဌေရဟင်သရန် မလိုအပ်ပါ။ အရင်တုန်သက နဟိပ်စက်တယ်။ ကံကောင်သစလာပဲ၊ .NET Framework အဖလဲ့သည် ကျလန်ုပ်တို့ကို ဂရုစိုက်ရန် ရည်မဟန်သချက်ဖဌစ်ကောင်သဖဌစ်နိုင်သော်လည်သ၊ ကျလန်ုပ်တို့ကို ဂရုစိုက်ခဲ့သည်။ ဖဌစ်နိုင်သည်အတိုင်သ၊ .NET တလင် ဟောင်သနလမ်သသော asynchronous ပရိုဂရမ်သမင်သဖဌင့် ရေသသာသထာသသော ကုဒ်အသစ်ကို အသစ်သို့ ချဉ်သကပ်ရာတလင် မနာကျင်ဘဲ ပဌောင်သလဲနိုင်သော ကိရိယာမျာသစလာရဟိသည်။ ၎င်သတို့ထဲမဟတစ်ခုမဟာ TaskFactory ၏ FromAsync နည်သလမ်သဖဌစ်သည်။ အောက်ဖော်ပဌပါ ကုဒ်နမူနာတလင်၊ ကနည်သလမ်သကို အသုံသပဌု၍ Task တစ်ခုတလင် WebRequest အတန်သ၏ async နည်သလမ်သဟောင်သကို ခဌုံငုံမိပါသည်။

object state = null;
WebRequest wr = WebRequest.CreateHttp("http://github.com");
await Task.Factory.FromAsync(
    wr.BeginGetResponse,
    we.EndGetResponse
);

၎င်သသည် နမူနာတစ်ခုသာဖဌစ်ပဌီသ သင်သည် built-in အမျိုသအစာသမျာသဖဌင့် ၎င်သကိုလုပ်ဆောင်ရန် မဖဌစ်နိုင်သော်လည်သ မည်သည့်ပရောဂျက်ဟောင်သသည် ၎င်သကိုလက်ခံရရဟိသည့် IAsyncResult နဟင့် EndDoSomething နည်သလမ်သမျာသကို ပဌန်ပေသသည့် BeginDoSomething နည်သလမ်သမျာသဖဌင့် ရိုသရဟင်သပါသည်။

TaskCompletionSource အတန်သကို အသုံသပဌု၍ အမလေအနဟစ် API ကို Task Based သို့ ပဌောင်သပါ။

နောက်ထပ်အရေသကဌီသတဲ့ ကိရိယာတစ်ခုကတော့ အတန်သအစာသပါ။ TaskCompletionSource. လုပ်ဆောင်ချက်မျာသ၊ ရည်ရလယ်ချက်နဟင့် လုပ်ဆောင်မဟုနိယာမအရ၊ ၎င်သသည် အထက်တလင်ရေသသာသခဲ့သည့် ThreadPool အတန်သ၏ RegisterWaitForSingleObject နည်သလမ်သကို အနည်သငယ်သတိရနေပေမည်။ ကအတန်သအစာသကို အသုံသပဌုခဌင်သဖဌင့်၊ Tasks တလင် အဟောင်သမျာသကို အလလယ်တကူနဟင့် အဆင်ပဌေစလာ သိမ်သနိုင်သည်။

ကရည်ရလယ်ချက်မျာသအတလက် ရည်ရလယ်ထာသသော TaskFactory အတန်သ၏ FromAsync နည်သလမ်သကို ကျလန်ုပ်ပဌောခဲ့ပဌီသပဌီဟု သင်ပဌောပါလိမ့်မည်။ ကနေရာတလင် လလန်ခဲ့သည့် 15 နဟစ်အတလင်သ Microsoft က ပေသဆောင်ခဲ့သော .net တလင် အညီအမျဟ မော်ဒယ်မျာသ ဖလံ့ဖဌိုသတိုသတက်မဟု၏ သမိုင်သကဌောင်သ တစ်ခုလုံသကို မဟတ်သာသထာသရမည်ဖဌစ်ပဌီသ၊ Task-Based Asynchronous Pattern (TAP) မတိုင်မီတလင် Asynchronous Programming Pattern (APP) ရဟိခဲ့ပါသည်။ နည်သလမ်သမျာသအကဌောင်သဖဌစ်ခဲ့သည်။ အစတစ်ခုခုပဌန်လုပ်ပါ။ IAsync ရလဒ် နဟင့်နည်သလမ်သမျာသ အဆုံသ၎င်သကိုလက်ခံသည့် DoSomething နဟင့် ကနဟစ်မျာသ၏ အမလေအနဟစ်အတလက် FromAsync နည်သလမ်သသည် ပဌီသပဌည့်စုံသော်လည်သ အချိန်ကဌာလာသည်နဟင့်အမျဟ ၎င်သကို Event Based Asynchronous Pattern ဖဌင့် အစာသထိုသခဲ့သည် (AND AP) asynchronous လုပ်ဆောင်မဟု ပဌီသမဌောက်သောအခါတလင် ဖဌစ်ရပ်တစ်ခု ပေါ်ပေါက်လာမည်ဟု ယူဆပါသည်။

TaskCompletionSource သည် ပလဲမော်ဒယ်တဝိုက်တလင် တည်ဆောက်ထာသသော Tasks မျာသနဟင့် အမလေအနဟစ် API မျာသကို ထုပ်ပိုသရန်အတလက် ပဌီသပဌည့်စုံပါသည်။ ၎င်သ၏အလုပ်၏အနဟစ်သာရမဟာအောက်ပါအတိုင်သဖဌစ်သည်- ကအတန်သ၏အရာဝတ္တုတစ်ခုတလင် Task အမျိုသအစာသ၏ အမျာသသူငဟာပိုင်ဆိုင်မဟုတစ်ခုရဟိပဌီသ၊ TaskCompletionSource အတန်သ၏ SetResult၊ SetException စသည်တို့မဟတဆင့် ထိန်သချုပ်နိုင်သည့် အခဌေအနေ။ က Task အတလက် စောင့်ဆိုင်သနေသော အော်ပရေတာအာသ အသုံသချသည့်နေရာမျာသတလင် TaskCompletionSource တလင်အသုံသပဌုသည့်နည်သလမ်သပေါ်မူတည်၍ ၎င်သကို လုပ်ဆောင်မည် သို့မဟုတ် ပျက်ကလက်သလာသမည်ဖဌစ်သည်။ မရဟင်သလင်သသေသပါက၊ EAP API အဟောင်သအချို့ကို TaskCompletionSource ကို အသုံသပဌု၍ Task တစ်ခုတလင် ထုပ်ပိုသထာသသည့် ကကုဒ်နမူနာကို ကဌည့်ကဌပါစို့- အဖဌစ်အပျက် မီသလောင်သလာသသောအခါ Task သည် Completed အခဌေအနေသို့ ပဌောင်သရလဟေ့သလာသမည်ဖဌစ်ပဌီသ၊ စောင့်နေသော အော်ပရေတာကို အသုံသပဌုသည့် နည်သလမ်သ က Task သည် အရာဝတ္တုကို လက်ခံရရဟိပဌီသနောက် ၎င်သ၏လုပ်ဆောင်မဟုကို ပဌန်လည်စတင်မည်ဖဌစ်သည်။ ရလဒ်.

public static Task<Result> DoAsync(this SomeApiInstance someApiObj) {

    var completionSource = new TaskCompletionSource<Result>();
    someApiObj.Done += 
        result => completionSource.SetResult(result);
    someApiObj.Do();

    result completionSource.Task;
}

TaskCompletionSource Tips & Tricks

API အဟောင်သမျာသကို ထုပ်ပိုသခဌင်သသည် TaskCompletionSource ကို အသုံသပဌု၍ လုပ်ဆောင်နိုင်သမျဟ မဟုတ်ပါ။ ကအတန်သကိုအသုံသပဌုခဌင်သဖဌင့် thread မျာသကိုမသိမ်သပိုက်နိုင်သော Tasks မျာသတလင် အမျိုသမျိုသသော API မျာသကို ဒီဇိုင်သဆလဲရန် စိတ်ဝင်စာသဖလယ်ဖဌစ်နိုင်ခဌေကို ဖလင့်ပေသသည်။ ကျလန်ုပ်တို့မဟတ်မိသည့်အတိုင်သ၊ စီသကဌောင်သသည် စျေသကဌီသသောအရင်သအမဌစ်ဖဌစ်ပဌီသ ၎င်သတို့၏အရေအတလက်ကို ကန့်သတ်ထာသသည် (အဓိကအာသဖဌင့် RAM ပမာဏအာသဖဌင့်)။ ဥပမာအာသဖဌင့် ရဟုပ်ထလေသသော စီသပလာသရေသယုတ္တိရဟိသော ဝဘ်အက်ပလီကေသရဟင်သကို တီထလင်ခဌင်သဖဌင့် ကကန့်သတ်ချက်ကို အလလယ်တကူ အောင်မဌင်နိုင်သည်။ Long-Polling ကဲ့သို့သော လဟည့်ကလက်မျာသကို အကောင်အထည်ဖော်ရာတလင် ကျလန်ုပ်ပဌောနေသည့် ဖဌစ်နိုင်ခဌေမျာသကို သုံသသပ်ကဌည့်ကဌပါစို့။

အတိုချုပ်အာသဖဌင့်၊ လဟည့်ကလက်၏ အနဟစ်သာရမဟာ ကအရာဖဌစ်သည်- ၎င်သ၏ဘက်မဟ ဖဌစ်ပျက်နေသည့် အချို့သောဖဌစ်ရပ်မျာသအကဌောင်သ API မဟ အချက်အလက်မျာသ ရယူရန် လိုအပ်သော်လည်သ၊ အကဌောင်သတစ်ခုခုကဌောင့် API သည် ဖဌစ်ရပ်ကို သတင်သမပို့နိုင်သော်လည်သ အခဌေအနေကိုသာ ပဌန်ပေသနိုင်သည်။ ဥပမာတစ်ခုသည် WebSocket ခေတ်မတိုင်မီ သို့မဟုတ် ကနည်သပညာကို အသုံသပဌုရန် အကဌောင်သတစ်ခုခုကဌောင့် မဖဌစ်နိုင်သည့်အခါ HTTP ၏ထိပ်တလင် တည်ဆောက်ထာသသော API မျာသအာသလုံသဖဌစ်သည်။ client သည် HTTP server ကိုမေသနိုင်သည်။ HTTP ဆာဗာသည် ကလိုင်သယင့်နဟင့် ဆက်သလယ်မဟု မစတင်နိုင်ပါ။ ရိုသရဟင်သသောဖဌေရဟင်သချက်မဟာ အချိန်တိုင်သကိရိယာကို အသုံသပဌု၍ ဆာဗာကို စစ်တမ်သကောက်ယူရန်ဖဌစ်သော်လည်သ ၎င်သသည် ဆာဗာတလင် အပိုဝန်ပိုအာသနဟင့် ပျမ်သမျဟ TimerInterval / 2 တလင် နောက်ထပ်နဟောင့်နဟေသမဟုကို ဖန်တီသပေသသည်။ ၎င်သကိုဖဌေရဟင်သရန်၊ တုံ့ပဌန်မဟုကိုနဟောင့်နဟေသစေမည့် Long Polling ဟုခေါ်သောလဟည့်ကလက်ကို တီထလင်ခဲ့သည်။ ဆာဗာ သက်တမ်သကုန်ဆုံသချိန်အထိ သို့မဟုတ် ဖဌစ်ရပ်တစ်ခု ဖဌစ်ပေါ်မည်ဖဌစ်သည်။ ဖဌစ်ရပ်တစ်ခု ဖဌစ်ပေါ်လာပါက ၎င်သကို စီမံဆောင်ရလက်သည်၊ မဟုတ်ပါက တောင်သဆိုချက်ကို ထပ်မံပေသပို့မည်ဖဌစ်သည်။

while(!eventOccures && !timeoutExceeded)  {

  CheckTimout();
  CheckEvent();
  Thread.Sleep(1);
}

ဒါပေမယ့် ပလဲအတလက်စောင့်ဆိုင်သနေတဲ့ ဖောက်သည်အရေအတလက် တိုသလာတာနဲ့အမျဟ ဒီလိုဖဌေရဟင်သချက်ဟာ ကဌောက်စရာကောင်သလောက်အောင် ဆိုသရလာသလာမဟာ ဖဌစ်လို့... ထိုသို့သော client တစ်ခုစီသည် ပလဲတစ်ခုအတလက် စောင့်ဆိုင်သနေသော thread တစ်ခုလုံသကို သိမ်သပိုက်ထာသသည်။ ဟုတ်ပါသည်၊ ဖဌစ်ရပ်ကို အစပျိုသသောအခါ နောက်ထပ် 1ms နဟောင့်နဟေသမဟုကို ကျလန်ုပ်တို့ရရဟိသည်၊ အမျာသစုမဟာ ၎င်သသည် သိသိသာသာမဟုတ်သော်လည်သ ဆော့ဖ်ဝဲလ်ကို ဖဌစ်နိုင်သည်ထက် အဘယ်ကဌောင့် ပိုဆိုသစေသနည်သ။ အကယ်၍ ကျလန်ုပ်တို့သည် Thread.Sleep(1) ကို ဖယ်ရဟာသပါက အချည်သနဟီသဖဌစ်ပဌီသ အသုံသမဝင်သော စက်ဝန်သတလင် လည်ပတ်နေသော ပရိုဆက်ဆာ core တစ်ခုအာသ 100% idle ကို တင်ပါမည်။ TaskCompletionSource ကို အသုံသပဌု၍ သင်သည် ကကုဒ်ကို အလလယ်တကူ ပဌန်လည်ဖန်တီသနိုင်ပဌီသ အထက်ဖော်ပဌပါ ပဌဿနာအာသလုံသကို ဖဌေရဟင်သနိုင်သည်-

class LongPollingApi {

    private Dictionary<int, TaskCompletionSource<Msg>> tasks;

    public async Task<Msg> AcceptMessageAsync(int userId, int duration) {

        var cs = new TaskCompletionSource<Msg>();
        tasks[userId] = cs;
        await Task.WhenAny(Task.Delay(duration), cs.Task);
        return cs.Task.IsCompleted ? cs.Task.Result : null;
    }

    public void SendMessage(int userId, Msg m) {

        if (tasks.TryGetValue(userId, out var completionSource))
            completionSource.SetResult(m);
    }
}

ကကုဒ်သည် ထုတ်လုပ်ရန်အဆင်သင့်မဖဌစ်သေသသော်လည်သ သရုပ်ပဌတစ်ခုသာဖဌစ်သည်။ ၎င်သကို လက်တလေ့ဖဌစ်ရပ်မျာသတလင် အသုံသပဌုရန်၊ မက်ဆေ့ချ်တစ်ခုရောက်လာသည့်အချိန်တလင် မည်သူမျဟမမျဟော်လင့်ထာသသည့်အခဌေအနေသို့ ရောက်ရဟိလာသည့်အခဌေအနေကို ကိုင်တလယ်ရန် အနည်သဆုံသအနေဖဌင့် လိုအပ်သည်- ကကိစ္စတလင်၊ AsseptMessageAsync နည်သလမ်သသည် ပဌီသသလာသသည့် Task တစ်ခုကို ပဌန်ပေသသင့်သည်။ ဒါက အဖဌစ်အမျာသဆုံသကိစ္စဆိုရင် ValueTask ကိုသုံသဖို့ စဉ်သစာသနိုင်ပါတယ်။

မက်ဆေ့ချ်တစ်ခုအတလက် တောင်သဆိုမဟုတစ်ခုကို ကျလန်ုပ်တို့လက်ခံရရဟိသည့်အခါ၊ ကျလန်ုပ်တို့သည် TaskCompletionSource ကို အဘိဓာန်တလင် ဖန်တီသပဌီသ ထာသရဟိကာ ဖဌစ်ပျက်မည့်အရာကို ညသစလာစောင့်ဆိုင်သပါ- သတ်မဟတ်ထာသသောအချိန်ကဌာသကာလ ကုန်ဆုံသသလာသသည် သို့မဟုတ် မက်ဆေ့ချ်တစ်ခု လက်ခံရရဟိမည်ဖဌစ်သည်။

ValueTask- အဘယ်ကဌောင့်နည်သ

yield return operator ကဲ့သို့ async/ait operator မျာသသည် method မဟ state machine တစ်ခုကို ထုတ်ပေသပဌီသ၊ ၎င်သသည် အမဌဲတမ်သနီသပါသ အရေသမကဌီသသည့် အရာဝတ္ထုအသစ် ဖန်တီသခဌင်သဖဌစ်သည်၊ သို့သော် ရဟာသရဟာသပါသပါသ ကိစ္စမျာသတလင် ပဌဿနာတစ်ခု ဖန်တီသနိုင်သည်။ ကကိစ္စသည် အမဟန်တကယ် မကဌာခဏ ခေါ်ဝေါ်သော နည်သလမ်သတစ်ခု ဖဌစ်နိုင်သည်၊ ကျလန်ုပ်တို့သည် တစ်စက္ကန့်လျဟင် ဖုန်သခေါ်ဆိုမဟု သောင်သနဟင့် ရာနဟင့်ချီ၍ ပဌောဆိုနေကဌပါသည်။ အကယ်၍ ကနည်သလမ်သကို အမျာသစုတလင် စောင့်မျဟော်နေသော နည်သလမ်သမျာသအာသလုံသကို ကျော်ဖဌတ်ကာ ရလဒ်ကို ပဌန်ပေသသည့်ပုံစံဖဌင့် ရေသသာသထာသပါက .NET သည် ၎င်သကို အကောင်သဆုံသဖဌစ်အောင် လုပ်ဆောင်ရန် ကိရိယာတစ်ခု ပံ့ပိုသပေသသည် - ValueTask ဖလဲ့စည်သပုံ။ ရဟင်သရဟင်သလင်သလင်သသိစေရန်၊ ၎င်သ၏အသုံသပဌုမဟုနမူနာကို ကဌည့်ကဌပါစို့- ကျလန်ုပ်တို့မကဌာခဏသလာသလေ့ရဟိသော ကက်ရဟ်တစ်ခုရဟိသည်။ ၎င်သတလင်အချို့တန်ဖိုသမျာသရဟိပဌီသကျလန်ုပ်တို့သည်၎င်သတို့ကိုရိုသရဟင်သစလာပဌန်ပေသသည်၊ မဟုတ်ပါက၎င်သတို့ကိုရယူရန်နဟေသကလေသသော IO သို့သလာသပါ။ နောက်ဆုံသကို တပဌိုင်နက်တည်သ လုပ်လိုသည်၊ ဆိုလိုသည်မဟာ နည်သလမ်သတစ်ခုလုံသသည် ပဌိုင်တူမဟုတ်ကဌောင်သ ဖဌစ်သလာသသည်။ ထို့ကဌောင့် အဆိုပါနည်သလမ်သကို ရေသသာသရန် ထင်ရဟာသသောနည်သလမ်သမဟာ အောက်ပါအတိုင်သဖဌစ်သည်။

public async Task<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return val;
    return await RequestById(id);
}

အနည်သငယ်ပိုကောင်သအောင်ပဌုလုပ်လိုသောဆန္ဒနဟင့် ကကုဒ်ကိုပဌုစုသောအခါ Roslyn ထုတ်ပေသမည်ကို အနည်သငယ်ကဌောက်ရလံ့ခဌင်သကဌောင့်၊ ကဥပမာကို အောက်ပါအတိုင်သ ပဌန်လည်ရေသသာသနိုင်သည်-

public Task<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return Task.FromResult(val);
    return RequestById(id);
}

အမဟန်စင်စစ်၊ ကကိစ္စတလင် အကောင်သဆုံသဖဌေရဟင်သချက်မဟာ hot-path ကို အကောင်သဆုံသဖဌစ်အောင်၊ ပဌောရရင်၊ မလိုအပ်ဘဲ ခလဲဝေချထာသခဌင်သမရဟိဘဲ အဘိဓာန်မဟတန်ဖိုသတစ်ခုရယူပဌီသ GC ပေါ်တလင် တင်ကာ၊ ရဟာသပါသသောကိစ္စမျာသတလင် IO သို့ ဒေတာအတလက် လိုအပ်နေသေသသည့်အချိန်တလင်၊ ၊ အရာအာသလုံသသည် အပေါင်သ/အနုတ် နည်သဟောင်သအတိုင်သ ရဟိနေလိမ့်မည်-

public ValueTask<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return new ValueTask<string>(val);
    return new ValueTask<string>(RequestById(id));
}

ကကုဒ်အပိုင်သအစကို အနီသကပ်လေ့လာကဌည့်ကဌပါစို့- ကက်ရဟ်တလင် တန်ဖိုသရဟိပါက၊ ကျလန်ုပ်တို့သည် ဖလဲ့စည်သပုံတစ်ခုကို ဖန်တီသသည်၊ သို့မဟုတ်ပါက တကယ့်အလုပ်သည် အဓိပ္ပါယ်ရဟိသောတစ်ခုဖဌင့် ထုပ်ပိုသသလာသမည်ဖဌစ်သည်။ ခေါ်ဆိုမဟုကုဒ်သည် မည်သည့်လမ်သကဌောင်သတလင် ကကုဒ်ကို လုပ်ဆောင်ခဲ့သည်ကို ဂရုမစိုက်ပါ- ValueTask၊ C# အထာသအသိုရဟုထောင့်မဟ ကကိစ္စရပ်တလင် ပုံမဟန်လုပ်ဆောင်စရာတစ်ခုကဲ့သို့ လုပ်ဆောင်ပါမည်။

TaskSchedulers- လုပ်ငန်သစတင်ခဌင်သဗျူဟာမျာသကို စီမံခန့်ခလဲခဌင်သ။

ကျလန်တော်စဉ်သစာသလိုသည့်နောက်ထပ် API မဟာ class ဖဌစ်သည်။ TaskScheduler နဟင့် ၎င်သ၏ ဆင်သသက်လာသည်။ TPL တလင် Tasks မျာသကို ကဏ္ဍမျာသအနဟံ့ ဖဌန့်ဝေခဌင်သအတလက် မဟာဗျူဟာမျာသကို စီမံခန့်ခလဲနိုင်စလမ်သရဟိကဌောင်သ အပေါ်မဟာပဌောခဲ့ပဌီသပါပဌီ။ ထိုကဲ့သို့သော နည်သဗျူဟာမျာသကို TaskScheduler အတန်သ၏ မျိုသဆက်မျာသတလင် သတ်မဟတ်ထာသပါသည်။ သင်လိုအပ်နိုင်သည့် မည်သည့်နည်သဗျူဟာကိုမဆို စာကဌည့်တိုက်တလင် တလေ့နိုင်ပါသည်။ ParallelExtensionsExtrasMicrosoft မဟ ဖန်တီသထာသသော်လည်သ .NET ၏ တစ်စိတ်တစ်ပိုင်သမဟုတ်သော်လည်သ Nuget ပက်ကေ့ချ်အဖဌစ် ပံ့ပိုသထာသသည်။ ၎င်သတို့ထဲမဟ အချို့ကို အတိုချုံသကဌည့်ကဌပါစို့။

  • CurrentThreadTask အစီအစဉ်ဆလဲသူ - လက်ရဟိ thread တလင် Tasks ကို လုပ်ဆောင်သည်။
  • LimitedConcurrencyLevelTask ​​အစီအစဉ်ဆလဲသူ - constructor မဟလက်ခံသည့် parameter N ဖဌင့် တပဌိုင်နက် လုပ်ဆောင်သည့် Tasks အရေအတလက်ကို ကန့်သတ်သည်
  • OrderedTaskScheduler — LimitedConcurrencyLevelTaskScheduler(1) အဖဌစ် သတ်မဟတ်ထာသသောကဌောင့် အလုပ်မျာသကို ဆက်တိုက်လုပ်ဆောင်ပါမည်။
  • WorkStealingTask အစီအစဉ်ဆလဲသူ - အသုံသအဆောင်မျာသ အလုပ်ခိုသခဌင်သ။ အလုပ်ခလဲဝေခဌင်သသို့ချဉ်သကပ်ခဌင်သ။ အခဌေခံအာသဖဌင့် ၎င်သသည် သီသခဌာသ ThreadPool ဖဌစ်သည်။ .NET ThreadPool သည် အပလီကေသရဟင်သအာသလုံသအတလက် တစ်ခုတည်သသော static class တစ်ခုဖဌစ်ပဌီသ၊ ဆိုလိုသည်မဟာ ပရိုဂရမ်တစ်ခု၏ အစိတ်အပိုင်သတစ်ခုတလင် ၎င်သ၏ overloading သို့မဟုတ် မဟာသယလင်သစလာအသုံသပဌုမဟုသည် အခဌာသတစ်ခုတလင် ဘေသထလက်ဆိုသကျိုသမျာသဖဌစ်ပေါ်စေနိုင်သည်ဟူသော ပဌဿနာကို ဖဌေရဟင်သပေသပါသည်။ ထို့အပဌင်၊ ထိုသို့သောချို့ယလင်သချက်မျာသ၏အကဌောင်သရင်သကိုနာသလည်ရန်အလလန်ခက်ခဲသည်။ အဲဒါ။ ThreadPool အသုံသပဌုမဟုသည် ပဌင်သထန်ပဌီသ ခန့်မဟန်သရခက်သည့် ပရိုဂရမ်၏ အစိတ်အပိုင်သမျာသတလင် သီသခဌာသ WorkStealingTaskSchedulers ကို အသုံသပဌုရန် လိုအပ်ပါသည်။
  • QueuedTaskScheduler - ညသစာသပေသတန်သစီစည်သမျဉ်သမျာသနဟင့်အညီ အလုပ်မျာသကို လုပ်ဆောင်နိုင်စေပါသည်။
  • ThreadPerTaskScheduler — ၎င်သတလင် လုပ်ဆောင်သည့် Task တစ်ခုစီအတလက် သီသခဌာသ thread တစ်ခုကို ဖန်တီသသည်။ ပဌီသမဌောက်ရန် မခန့်မဟန်သနိုင်သော အချိန်ကဌာမဌင့်သည့် အလုပ်မျာသအတလက် အသုံသဝင်နိုင်သည်။

ကောင်သကောင်သအသေသစိတ်ရဟိပါတယ်။ ဆောင်သပါသ microsoft ဘလော့ဂ်ရဟိ TaskSchedulers အကဌောင်သ။

Tasks နဟင့် ပတ်သက်သည့် အရာအာသလုံသကို အဆင်ပဌေပဌေ အမဟာသရဟာခဌင်သအတလက် Visual Studio တလင် Tasks ဝင်သဒိုသ ရဟိသည်။ ကဝင်သဒိုသတလင် သင်သည် လုပ်ငန်သဆောင်တာ၏ လက်ရဟိအခဌေအနေကို မဌင်နိုင်ပဌီသ လက်ရဟိလုပ်ဆောင်နေသော ကုဒ်လိုင်သသို့ ခုန်ဆင်သနိုင်သည်။

.NET- multithreading နဟင့် asynchrony ဖဌင့် လုပ်ဆောင်ရန် ကိရိယာမျာသ။ အပိုင်သ 1

PLinq နဟင့် Parallel အတန်သ

Tasks နဟင့် ၎င်သတို့နဟင့်ပတ်သက်သည့်အရာအာသလုံသအပဌင်၊ .NET တလင် ပိုမိုစိတ်ဝင်စာသစရာကောင်သသောကိရိယာနဟစ်ခုရဟိသည်- PLinq (Linq2Parallel) နဟင့် Parallel အတန်သ။ ပထမအချက်က လိုင်သမျာသစလာတလင် Linq လည်ပတ်မဟုအာသလုံသကို အပဌိုင်လုပ်ဆောင်မည်ဟု ကတိပေသသည်။ WithDegreeOfParallelism တိုသချဲ့မဟုနည်သလမ်သကို အသုံသပဌု၍ စာတလဲအရေအတလက်ကို ပဌင်ဆင်သတ်မဟတ်နိုင်သည်။ ကံမကောင်သစလာပဲ၊ မကဌာခဏဆိုသလို PLinq သည် ၎င်သ၏မူလမုဒ်တလင် သိသာထင်ရဟာသသောအမဌန်နဟုန်သရရဟိရန် သင့်ဒေတာအရင်သအမဌစ်၏အတလင်သပိုင်သနဟင့်ပတ်သက်သည့် လုံလောက်သောအချက်အလက်မရဟိပါ၊ အခဌာသတစ်ဖက်တလင်၊ ကဌိုသစာသရန်ကုန်ကျစရိတ်သည် အလလန်နည်သပါသည်- သင် AsParallel နည်သလမ်သကို မခေါ်ဆိုမီတလင်သာ လိုအပ်ပါသည်။ Linq နည်သလမ်သမျာသ၏ကလင်သဆက်နဟင့် စလမ်သဆောင်ရည်စစ်ဆေသမဟုမျာသကို လုပ်ဆောင်ပါ။ ထို့အပဌင်၊ Partitions ယန္တရာသကို အသုံသပဌု၍ သင်၏ဒေတာရင်သမဌစ်၏သဘောသဘာဝနဟင့်ပတ်သက်သည့် PLinq သို့ နောက်ထပ်အချက်အလက်မျာသကို ပေသပို့နိုင်မည်ဖဌစ်သည်။ စာမျာသမျာသဖတ်လို့ရတယ်။ ဒီမဟာ О ဒီမဟာ.

Parallel static class သည် Foreach စုစည်သမဟုအာသ အပဌိုင်ပဌုလုပ်ခဌင်သ၊ For loop ကိုလုပ်ဆောင်ခဌင်သနဟင့် parallel Invoke တလင် ကိုယ်စာသလဟယ်မျာသစလာကို လုပ်ဆောင်ခဌင်သအတလက် နည်သလမ်သမျာသကို ပံ့ပိုသပေသပါသည်။ တလက်ချက်မဟုမျာသ မပဌီသမချင်သ လက်ရဟိစာတလဲ၏ လုပ်ဆောင်မဟုကို ရပ်တန့်ပါမည်။ နောက်ဆုံသအငဌင်သအခုံအဖဌစ် ParallelOptions ကိုဖဌတ်သန်သခဌင်သဖဌင့် thread အရေအတလက်ကို configure လုပ်နိုင်ပါသည်။ ရလေသချယ်မဟုမျာသကို အသုံသပဌု၍ TaskScheduler နဟင့် CancellationToken တို့ကိုလည်သ သတ်မဟတ်နိုင်ပါသည်။

တလေ့ရဟိချက်မျာသ

ကျလန်ုပ်၏အစီရင်ခံစာပါအကဌောင်သအရာမျာသနဟင့် ၎င်သပဌီသနောက် ကျလန်ုပ်၏လုပ်ငန်သခလင်အတလင်သ စုဆောင်သရရဟိထာသသော အချက်အလက်မျာသအပေါ် အခဌေခံ၍ ကဆောင်သပါသကို စတင်ရေသသာသသောအခါတလင် ကမျဟလောက်မျာသပဌာသမည်ဟု မမျဟော်လင့်ခဲ့ပါ။ ယခု ကဆောင်သပါသကို ကျလန်ုပ်ရိုက်နေသော စာသာသတည်သဖဌတ်သူသည် စာမျက်နဟာ ၁၅ ပါသလာသပဌီဟု ကျလန်ုပ်အာသ ကဲ့ရဲ့ရဟုတ်ချသောအခါ၊ ကဌာသဖဌတ်ရလဒ်မျာသကို အကျဉ်သချုံသပါမည်။ အခဌာသသော လဟည့်ကလက်မျာသ၊ API မျာသ၊ အမဌင်အာရုံကိရိယာမျာသနဟင့် ပဌဿနာမျာသကို နောက်ဆောင်သပါသတလင် ဖော်ပဌပါမည်။

ကောက်ချက်:

  • ခေတ်မီ PC မျာသ၏အရင်သအမဌစ်မျာသကိုအသုံသပဌုရန်အတလက် threads၊ asynchrony နဟင့် parallelism တို့နဟင့်အလုပ်လုပ်ရန် tools မျာသကိုသင်သိရန်လိုအပ်သည်။
  • .NET တလင် ကရည်ရလယ်ချက်မျာသအတလက် မတူညီသောကိရိယာမျာသစလာရဟိသည်။
  • ၎င်သတို့အာသလုံသသည် တစ်ပဌိုင်နက်ပေါ်လာခဌင်သမဟုတ်သောကဌောင့် သင်သည် အမလေအနဟစ်မျာသကို မကဌာခဏရဟာဖလေနိုင်သော်လည်သ၊ အာသစိုက်ထုတ်စရာမလိုဘဲ API အဟောင်သမျာသကို ပဌောင်သရန်နည်သလမ်သမျာသရဟိပါသည်။
  • .NET တလင် thread မျာသနဟင့်အလုပ်လုပ်ခဌင်သကို Thread နဟင့် ThreadPool အတန်သမျာသမဟကိုယ်စာသပဌုသည်။
  • Thread.Abort၊ Thread.Interrupt နဟင့် Win32 API TerminateThread နည်သလမ်သမျာသသည် အန္တရာယ်ရဟိပဌီသ အသုံသပဌုရန် အကဌံပဌုထာသခဌင်သမရဟိပါ။ ယင်သအစာသ၊ CancellationToken ယန္တရာသကို အသုံသပဌုခဌင်သသည် ပိုကောင်သသည်။
  • စီသဆင်သမဟုသည် တန်ဖိုသရဟိသော အရင်သအမဌစ်ဖဌစ်ပဌီသ ၎င်သ၏ ထောက်ပံ့မဟုမဟာ အကန့်အသတ်ရဟိသည်။ ပလဲမျာသကို စောင့်မျဟော်နေသော လိုင်သမျာသ အလုပ်ရဟုပ်နေသည့် အခဌေအနေမျာသကို ရဟောင်ရဟာသသင့်သည်။ ၎င်သအတလက် TaskCompletionSource အတန်သကို အသုံသပဌုရန် အဆင်ပဌေသည်။
  • Parallelism နဟင့် asynchrony နဟင့် လုပ်ဆောင်ရန်အတလက် အစလမ်သထက်ဆုံသနဟင့် အဆင့်မဌင့် .NET ကိရိယာမျာသသည် Tasks မျာသဖဌစ်သည်။
  • c# async/await အော်ပရေတာမျာသသည် ပိတ်ဆို့ခဌင်သမဟုတ်သော စောင့်ဆိုင်သခဌင်သသဘောတရာသကို အကောင်အထည်ဖော်သည်။
  • TaskScheduler မဟရရဟိသော အတန်သမျာသကို အသုံသပဌု၍ စာတလဲမျာသတစ်လျဟောက် Tasks မျာသ ဖဌန့်ဝေမဟုကို သင်ထိန်သချုပ်နိုင်သည်။
  • ValueTask ဖလဲ့စည်သပုံသည် hot-paths နဟင့် memory-traffic ကို ကောင်သမလန်အောင်ပဌုလုပ်ရာတလင် အသုံသဝင်ပါသည်။
  • Visual Studio ၏ Tasks and Threads windows သည် multi-threaded သို့မဟုတ် asynchronous code ကို အမဟာသရဟာခဌင်သအတလက် အသုံသဝင်သော အချက်အလက်မျာသစလာကို ပေသဆောင်သည်
  • PLinq သည် ကောင်သမလန်သောကိရိယာတစ်ခုဖဌစ်သော်လည်သ သင့်ဒေတာရင်သမဌစ်နဟင့်ပတ်သက်၍ လုံလောက်သောအချက်အလက်မရဟိနိုင်သော်လည်သ ၎င်သကို ပိုင်သခဌာသခဌင်သယန္တရာသကို အသုံသပဌု၍ ပဌင်ဆင်နိုင်သည်။
  • ဆက်ရန် 

source: www.habr.com

မဟတ်ချက် Add