අසමමුහුර්ත ක්රමලේඛනය කේත පදනම හරහා “වර්ධනය” වේ. එය සොම්බි වෛරසයකට සංසන්දනය කර ඇත . හොඳම විසඳුම එය වර්ධනය වීමට ඉඩ දීමයි, නමුත් සමහර විට එය කළ නොහැකිය.
අර්ධ වශයෙන් අසමමුහුර්ත කේත පදනමක් සමඟ කටයුතු කිරීම සඳහා මම මගේ Nito.AsyncEx පුස්තකාලයේ වර්ග කිහිපයක් ලියා ඇත . සෑම තත්වයක් තුළම ක්රියාත්මක වන විසඳුමක් නොමැත.
විසඳුම ඒ
එහි සන්දර්භය වෙත නැවත සමමුහුර්ත කිරීමට අවශ්ය නොවන සරල අසමමුහුර්ත ක්රමයක් ඔබට තිබේ නම්, ඔබට මෙය භාවිතා කළ හැකිය Task.WaitAndUnwrapException
:
var task = MyAsyncMethod();
var result = task.WaitAndUnwrapException();
ඔබට භාවිතා කිරීමට අවශ්ය නැතTask.Wait
හෝ Task.Result
ඒවා ව්යතිරේකයන් ඔතා ඇති නිසා AggregateException
.
මෙම විසඳුම සුදුසු MyAsyncMethod
වන්නේ එහි සන්දර්භය වෙත නැවත සමමුහුර්ත නොකරන්නේ නම් පමණි . වෙනත් වචන වලින් කිවහොත්, සෑම දෙයක්ම අවසන් await
විය MyAsyncMethod
යුතුය ConfigureAwait(false)
. මෙයින් අදහස් කරන්නේ එයට කිසිදු UI අංගයක් යාවත්කාලීන කිරීමට හෝ ASP.NET ඉල්ලීම් සන්දර්භයට ප්රවේශ විය නොහැකි බවයි.
විසඳුම බී
MyAsyncMethod
එහි සන්දර්භය වෙත නැවත සමමුහුර්ත කිරීමට අවශ්ය නම් , ඔබට AsyncContext.RunTask
කැදැලි සන්දර්භයක් සැපයීමට භාවිතා කළ හැකිය :
var result = AsyncContext.RunTask(MyAsyncMethod).Result;
* යාවත්කාලීන කිරීම 4/14/2014: පුස්තකාලයේ නවතම අනුවාද වල API පහත පරිදි වේ:
var result = AsyncContext.Run(MyAsyncMethod);
( Task.Result
මෙම උදාහරණයේ භාවිතා කිරීම කමක් නැත, මන්ද RunTask
එය ප්රචාරය කරනු ඇතTask
ව්යතිරේකයන් ).
ඒ AsyncContext.RunTask
වෙනුවට ඔබට අවශ්ය වීමට හේතුව Task.WaitAndUnwrapException
වින්ෆෝම්ස් / ඩබ්ලිව්පීඑෆ් / එස්එල් / ඒඑස්පී.නෙට් හි සිදුවිය හැකි තරමක් සියුම් අවහිරතා හැකියාවයි:
- සමමුහුර්ත ක්රමයක් අසින්ක් ක්රමයක් ලෙස හැඳින්වේ, a
Task
.
- සමමුහුර්ත ක්රමය මඟින් අවහිර කිරීම බලා සිටී
Task
.
- මෙම
async
ක්රමය භාවිතා කරයි await
තොරව ConfigureAwait
.
- මෙම
Task
වන විට එය පමණක් සම්පූර්ණ නිසා මෙම තත්වය තුල දී සම්පූර්ණ කළ නොහැකි async
ක්රමය නිමි ය; මෙම async
බැවින් ඒ සඳහා දිගටම පවත්වා සැලසුම් කිරීමට තැත් කිරීම හේතුවෙන් ක්රමය සම්පූර්ණ කළ නොහැකි SynchronizationContext
, සහ සම මුහුර්තක ක්රමය දැනටමත් එම සන්දර්භය තුළ ධාවනය වන නිසා, WinForms / WPF / ශ්රී ලංකා / ASP.NET ලකුණු කිරීමට අඛණ්ඩව ඉඩ දෙන්නේ නැහැ.
ConfigureAwait(false)
සෑම async
ක්රමයක් තුළම හැකිතාක් භාවිතා කිරීම හොඳ අදහසක් වීමට මෙය එක් හේතුවකි .
විසඳුම සී
AsyncContext.RunTask
සෑම අවස්ථාවකම ක්රියා නොකරනු ඇත. නිදසුනක් ලෙස, මෙම async
ක්රමය සම්පූර්ණ කිරීමට UI සිදුවීමක් අවශ්ය වන යමක් බලා සිටී නම්, ඔබ කැදැලි සන්දර්භය සමඟ පවා අවහිර කරනු ඇත. එවැනි අවස්ථාවකදී, ඔබට async
නූල් තටාකයේ ක්රමය ආරම්භ කළ හැකිය :
var task = Task.Run(async () => await MyAsyncMethod());
var result = task.WaitAndUnwrapException();
කෙසේ වෙතත්, මෙම විසඳුම සඳහා MyAsyncMethod
නූල් සංචිත සන්දර්භය තුළ ක්රියාත්මක වන දෙයක් අවශ්ය වේ. එබැවින් එයට UI අංග යාවත්කාලීන කිරීමට හෝ ASP.NET ඉල්ලීම් සන්දර්භයට ප්රවේශ විය නොහැක. එවැනි අවස්ථාවකදී, ඔබට ConfigureAwait(false)
එහි await
ප්රකාශවලට එකතු කළ හැකි අතර විසඳුම A භාවිතා කරන්න.
යාවත්කාලීන කිරීම, 2019-05-01: වර්තමාන "අවම-නරකම පිළිවෙත්" මෙහි MSDN ලිපියක ඇත .