වේගවත්ම ඉගෙනීම සඳහා ..
ක්රම ක්රියාත්මක කිරීමේ ප්රවාහය තේරුම් ගන්න (රූප සටහනක් සමඟ): මිනිත්තු 3 යි
ප්රශ්න ස්වයං විචාරය (ඉගෙනීම සඳහා): මිනිත්තු 1 යි
සින්ටැක්ස් සීනි හරහා ඉක්මනින් යන්න: මිනිත්තු 5 යි
සංවර්ධකයෙකුගේ ව්යාකූලත්වය බෙදා ගන්න: මිනිත්තු 5 යි
ගැටලුව: සාමාන්ය කේතය තථ්ය-ලෝක ක්රියාත්මක කිරීම අසින්ක් කේතයට ඉක්මනින් වෙනස් කරන්න: මිනිත්තු 2 යි
ඊළඟට කොහෙද?
ක්රම ක්රියාත්මක කිරීමේ ප්රවාහය තේරුම් ගන්න (රූප සටහනක් සමඟ): මිනිත්තු 3 යි
මෙම රූපයේ, # 6 වෙත අවධානය යොමු කරන්න (වැඩි යමක් නැත)
# 6 පියවරේදී: ක්රියාත්මක නොවීම නිසා ක්රියාත්මක කිරීම මෙහි නතර විය. එය දිගටම කරගෙන යාමට getStringTask (ආකාරයේ ශ්රිතයක්) වෙතින් ප්රති result ලයක් අවශ්ය වේ. එම නිසා, එය await
එහි ප්රගතිය අත්හිටුවීමට සහ ඇමතුමට පාලනය (අස්වැන්න) ලබා දීමට ක්රියාකරුවෙකු භාවිතා කරයි (මෙම ක්රමයේ). GetStringTask සඳහා සත්ය ඇමතුම මීට පෙර # 2 දී සිදු කරන ලදි. # 2 හි දී ප්රති string ලයක් ලබා දෙන බවට පොරොන්දුවක් දෙන ලදි. නමුත් එය ප්රති result ලය ලබා දෙන්නේ කවදාද? අපි (# 1: AccessTheWebAsync) නැවත 2 වන ඇමතුමක් ලබා ගත යුතුද? ප්රති result ලය ලැබෙන්නේ කාටද, # 2 (ඇමතුම් ප්රකාශය) හෝ # 6 (ප්රකාශය බලාපොරොත්තුවෙන්)
AccessTheWebAsync () හි බාහිර ඇමතුම්කරු ද දැන් බලා සිටී. එබැවින් අමතන්නා AccessTheWebAsync සඳහා බලා සිටින අතර AccessTheWebAsync මේ මොහොතේ GetStringAsync සඳහා බලා සිටී. සිත්ගන්නා කරුණ නම් AccessTheWebAsync බලා සිටීමට පෙර යම් වැඩක් (# 4) කර ඇති අතර සමහර විට බලා සිටීමෙන් කාලය ඉතිරි කර ගත හැකිය. බහු කාර්යයන් සඳහා එකම නිදහස බාහිර ඇමතුම්කරුට (සහ දාමයේ සිටින සියලුම ඇමතුම්කරුවන්ට) ලබා ගත හැකි අතර මෙය මෙම 'අසින්ක්' හි විශාලතම ප්ලස් වේ! එය සමමුහුර්ත හෝ සාමාන්ය යැයි ඔබට හැඟේ නමුත් එය එසේ නොවේ.
මතක තබා ගන්න, ක්රමය දැනටමත් ආපසු ලබා දී ඇත (# 2), එයට නැවත පැමිණිය නොහැක (දෙවන වරටත් නැත). ඉතින් අමතන්නා දැන ගන්නේ කෙසේද? එය සියල්ලම කාර්යයන් වේ! කාර්යය සම්මත විය. කාර්යය සඳහා බලා සිටියේය (ක්රමය නොවේ, වටිනාකම නොවේ). කාර්යය තුළ අගය සැකසෙනු ඇත. කාර්ය තත්වය සම්පූර්ණ කිරීමට සකසනු ඇත. අමතන්නා කාර්යය නිරීක්ෂණය කරයි (# 6). එබැවින් 6 # යනු ප්රති / ලය ලැබෙන්නේ කොහෙන්ද / කවුද යන්නට පිළිතුරයි. වැඩිදුර කියවීම පසුව මෙහි .
ඉගෙනීම සඳහා ප්රශ්න ස්වයං විමර්ශනය: මිනිත්තු 1 යි
ප්රශ්නය ටිකක් සකස් කරමු:
ඒ කෙසේ ද, භාවිතා කිරීමට විට හා ? async
await
Tasks
ඉගෙනීම Task
අනෙක් දෙක ස්වයංක්රීයව ආවරණය කරන නිසා (සහ ඔබේ ප්රශ්නයට පිළිතුරු සපයයි)
සින්ටැක්ස් සීනි හරහා ඉක්මනින් යන්න: මිනිත්තු 5 යි
- පරිවර්තනය කිරීමට පෙර (මුල් ක්රමය)
internal static int Method(int arg0, int arg1)
{
int result = arg0 + arg1;
IO(); // Do some long running IO.
return result;
}
- ඉහත ක්රමය ඇමතීමට කාර්ය සාධක සහිත ක්රමයක්
internal static Task<int> MethodTask(int arg0, int arg1)
{
Task<int> task = new Task<int>(() => Method(arg0, arg1));
task.Start(); // Hot task (started task) should always be returned.
return task;
}
අපි බලා සිටියේ හෝ අසමමුහුර්තව සඳහන් කළාද? නැත. ඉහත ක්රමය අමතන්න, ඔබට අධීක්ෂණය කළ හැකි කාර්යයක් ලැබෙනු ඇත. කාර්යය නැවත පැමිණෙන්නේ කුමක් දැයි ඔබ දැනටමත් දන්නවා .. පූර්ණ සංඛ්යාවක්.
- කාර්යයක් ඇමතීම තරමක් උපක්රමශීලී වන අතර මූල පද දිස්වීමට පටන් ගන්නේ එවිටය. අපි MethodTask () අමතමු
internal static async Task<int> MethodAsync(int arg0, int arg1)
{
int result = await HelperMethods.MethodTask(arg0, arg1);
return result;
}
ඉහත කේතය පහත රූපයේ එකතු කර ඇත:
- අපි 'බලා සිටිමු' කාර්යය අවසන් කිරීමට. එබැවින්
await
- අපි බලා සිටීම භාවිතා කරන බැවින්, අප භාවිතා කළ යුතුය
async
(අනිවාර්ය සින්ටැක්ස්)
- සමග MethodAsync
Async
උපසර්ගය සමඟ (කේතීකරණ ප්රමිතිය)
await
තේරුම් ගැනීමට පහසු නමුත් ඉතිරි දෙක ( async
, Async
) නොවිය හැක :). හොඳයි, එය සම්පාදකයාට වැඩි අර්ථයක් ලබා දිය යුතුය. වැඩිදුර කියවීම පසුව මෙහි
එබැවින් කොටස් 2 ක් ඇත.
- 'කාර්යය' සාදන්න
- කාර්යය ඇමතීමට සින්ටැක්ටික් සීනි සාදන්න (
await+async
)
මතක තබා ගන්න, අපට AccessTheWebAsync () වෙත බාහිර ඇමතුමක් ලබා දී ඇති අතර එම ඇමතුමද ඉතිරි නොවේ ... එනම් එයටද එයම අවශ්ය await+async
වේ. දාමය දිගටම. නමුත් සෑම විටම aTask
එක් කෙළවරක .
සියල්ල හරි, නමුත් එක් සංවර්ධකයෙක් # 1 (කාර්යය) අතුරුදහන් වීම දැක පුදුමයට පත් විය ...
සංවර්ධකයෙකුගේ ව්යාකූලත්වය බෙදා ගන්න: මිනිත්තු 5 යි
සංවර්ධකයෙකු ක්රියාත්මක නොකිරීමේ වැරැද්දක් කර ඇති Task
නමුත් එය තවමත් ක්රියාත්මක වේ! මෙහි ඇති පිළිගත් පිළිතුර සහ ප්රශ්නය තේරුම් ගැනීමට උත්සාහ කරන්න . ඔබ කියවා සම්පූර්ණයෙන් තේරුම් ගෙන ඇතැයි සිතමි. සාරාංශය නම්, අපට 'කාර්යය' නොපෙනේ / ක්රියාත්මක නොවිය හැකි නමුත් එය දෙමව්පියන් / ආශ්රිත පන්තියක කොතැනක හෝ ක්රියාත්මක වේ. අපගේ උදාහරණයේ MethodAsync()
දී Task
( MethodTask()
) අප විසින්ම එම ක්රමය ක්රියාත්මක කිරීමට වඩා දැනටමත් ඉදිකර ඇති කැඳවීමක් පහසුය . බොහෝ සංවර්ධකයින්ට ඔවුන්ගේ හිස එසවීම දුෂ්කර යTasks
කේතයක් අසමමුහුර්ත එකක් බවට පරිවර්තනය කරන අතරම එහා මෙහා .
ඉඟිය: දුෂ්කරතාවය පිටතින් ලබා ගැනීම සඳහා දැනට පවතින අසින්ක් ක්රියාත්මක කිරීමක් (වැනි MethodAsync
හෝ ToListAsync
) සොයා ගැනීමට උත්සාහ කරන්න . එබැවින් අපට අවශ්ය වන්නේ අසින්ක් සමඟ ගනුදෙනු කර බලා සිටීම පමණි (එය සාමාන්ය කේතයට පහසු සහ තරමක් සමාන ය)
ගැටළුව: සාමාන්ය කේතය සැබෑ ලෝකයේ ක්රියාත්මක කිරීම අසින්ක් මෙහෙයුමට ඉක්මනින් වෙනස් කරන්න: මිනිත්තු 2 යි
දත්ත ස්ථරයේ පහත දැක්වෙන කේත රේඛාව කැඩීමට පටන් ගත්තේය (බොහෝ ස්ථාන). අපගේ කේත සමහරක් .Net frame 4.2. * සිට .Net core දක්වා යාවත්කාලීන කළ බැවිනි. යෙදුම පුරා පැය 1 කින් මෙය නිවැරදි කිරීමට අපට සිදු විය!
var myContract = query.Where(c => c.ContractID == _contractID).First();
පහසුයි!
- අපි EntityFramework nuget පැකේජය ස්ථාපනය කළේ එයට QueryableExtensions ඇති බැවිනි. නැතහොත් වෙනත් වචන වලින් කිවහොත් එය අසින්ක් ක්රියාත්මක කිරීම (කර්තව්යය) කරයි, එබැවින් අපට සරල
Async
හාawait
කේත වලින් .
- namespace = Microsoft.EntityFrameworkCore
ඇමතුම් කේත රේඛාව මේ ආකාරයට වෙනස් වී ඇත
var myContract = await query.Where(c => c.ContractID == _contractID).FirstAsync();
- ක්රම අත්සන වෙනස් කර ඇත
Contract GetContract(int contractnumber)
වෙත
async Task<Contract> GetContractAsync(int contractnumber)
ඇමතුම් ක්රමයටද බලපෑමක් ඇති විය: GetContractAsync(123456);
ලෙස හැඳින්වේGetContractAsync(123456).Result;
අපි එය විනාඩි 30 කින් සෑම තැනකම වෙනස් කළා!
නමුත් ගෘහ නිර්මාණ ශිල්පියා අපට පැවසුවේ මේ සඳහා පමණක් EntityFramework පුස්තකාලය භාවිතා නොකරන ලෙසයි! අපොයි! නාට්යය! ඉන්පසු අපි අභිරුචි කාර්ය ක්රියාත්මක කිරීමක් (යූක්) සිදු කළෙමු. ඔබ දන්නේ කෙසේද. තවමත් පහසුයි! .. යූක් ..
ඊළඟට කොහෙද? ඒඑස්පී නෙට් කෝර් හි සමමුහුර්ත ඇමතුම් අසමමුහුර්ත බවට පරිවර්තනය කිරීම
ගැන අපට නැරඹිය හැකි අපූරු ඉක්මන් වීඩියෝවක් තිබේ , සමහර විට මෙය කියවීමෙන් පසු යමෙකු යා හැකි දිශාව විය හැකිය.