前言
ಸಾಮಾನ್ಯವಾಗಿ ಪಡೆಯಿರಿ ValueTaskನೇರವಾಗಿ await ಚರ್ಚಿಸಲು ಏನೂ ಇಲ್ಲ ಎಂದು ತೋರುತ್ತಿದೆ. ಆದರೆ .NET ರನ್ಟೈಮ್ ಮತ್ತು ASP.NET ಕೋರ್ನ ಹಾಟ್ ಕೋಡ್ ಕೋಡ್ನಲ್ಲಿ, ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಇನ್ನೊಂದು ರೀತಿಯ ಬರವಣಿಗೆಯ ಕಾನೂನನ್ನು ನೋಡಬಹುದು: ಪರಿಶೀಲಿಸಿ IsCompletedSuccessfullyಸಿಂಕ್ರೊನೈಸೇಶನ್ ಯಶಸ್ವಿಯಾದಾಗ, ಫಲಿತಾಂಶವನ್ನು ನೇರವಾಗಿ ಓದಿ ಮತ್ತು ಅದು ಪೂರ್ಣಗೊಳ್ಳದಿದ್ದಾಗ ಮಾತ್ರ ನಿರೀಕ್ಷಿಸಿ.
ಇದರ ಬಗ್ಗೆ ಜನರು ಪ್ರಶ್ನೆಯನ್ನು ಹೊಂದಲು ಇದು ತುಂಬಾ ಸುಲಭವಾಗಿದೆ: await 会会不是电影技术?又ಕೆಲವು ಕೋಡ್ಗಳು ಏಕೆ? ValueTask 老成 Task?ಈ ಪಠ್ಯವನ್ನು ಈ ಪ್ರಶ್ನೆಗಳ ಸುತ್ತ ಅಭಿವೃದ್ಧಿಪಡಿಸಲಾಗುವುದು ಮತ್ತು ಸಾಮಾನ್ಯ ಬರವಣಿಗೆಯ ವಿಧಾನಗಳು ಮತ್ತು ಆಂತರಿಕ ಚೌಕಟ್ಟುಗಳ ನಡುವಿನ ವ್ಯತ್ಯಾಸದ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸಲಾಗುತ್ತದೆ.
ಉತ್ತರ: ಒಂದನ್ನು ಪಡೆಯಿರಿ ValueTask 后,终最最最最是电影 await ಮಾಡಬಹುದು.
var result = await valueTask;
ಹಿಂದಿನ ವಿಭಾಗದಲ್ಲಿ ಉಲ್ಲೇಖಿಸಲಾದ ಫ್ರೇಮ್ವರ್ಕ್ 写法会先电影上海最好的微信;ಕಾರ್ಯಾಚರಣೆಯು ಇನ್ನೂ ಪೂರ್ಣಗೊಂಡಿಲ್ಲದಿದ್ದರೆ, ಅಥವಾ ಅದು ಈಗಾಗಲೇ ವಿಫಲವಾಗಿದ್ದರೆ, ರದ್ದುಗೊಳಿಸಿದ್ದರೆ,再交给电影的周步.
ಇದು ಪ್ರತಿ ಬಳಕೆದಾರರಿಗೆ ಅಲ್ಲ await 前做 ತೀರ್ಪು, 说是面在电影热点上上上可以可以可以名种。 v10.0.0 ಅದನ್ನು ಹೇಗೆ ಬರೆಯಲಾಗಿದೆ ಎಂಬುದರ ಮೂಲ ಕೋಡ್ ಅನ್ನು ನೋಡಿ.
电影 ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ 电影 电影 电影 电视
await ಇದು ಹಿಂದಿನಂತೆಯೇ ಅಲ್ಲ IsCompleted(
var awaiter = valueTask.GetAwaiter();
if (!awaiter.IsCompleted)
{
// 保存 async 方法的状态,并注册完成后的后续回调。
// 恢复后会调用 awaiter.GetResult()。
}
else
{
awaiter.GetResult();
}
ಮೇಲಿನ ಕೋಡ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು ವಿವರಿಸಲು ಮಾತ್ರ, ನಿಜವಾದ ರಚಿತವಾದ ಕೋಡ್ ಯಂತ್ರ ಸ್ಥಿತಿ ಕ್ಷೇತ್ರ, ವಿನಾಯಿತಿ ಮತ್ತು ಸಂದರ್ಭವನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. ಪ್ರಮುಖ ತರ್ಕವು ಸಂಕೀರ್ಣವಾಗಿಲ್ಲ:
- 已电影电影设计: ಫಲಿತಾಂಶಗಳನ್ನು ನೇರವಾಗಿ ಪಡೆದುಕೊಳ್ಳಿ,不ರಿಜಿಸ್ಟ್ರೇಶನ್ ಫಾಲೋ-ಅಪ್ ಕಾಲ್ಬ್ಯಾಕ್.
- 已剧方或已消: ನೇರ ಕರೆಯಂತೆಯೇ
GetResult(),设时间或新时按await的语义手出。 - 尚未安全: ನೋಂದಣಿ ಅನುಸರಣೆ 回谺, ಪೂರ್ಣಗೊಂಡ ನಂತರ ಮರು-ಕರೆ
GetResult().
ಅಂದರೆ, ನಿಮ್ಮನ್ನು ನ್ಯಾಯಾಧೀಶರು ಎಂದು ಕರೆಯಿರಿ IsCompleted 今不能省掉最二正视,反而 ಯಶಸ್ವಿ, ವಿಫಲವಾದ ಮತ್ತು ರದ್ದುಗೊಳಿಸಲಾದ ಮೂರು ರೀತಿಯ ಪೂರ್ಣಗೊಂಡ ಸ್ಥಿತಿಗಳನ್ನು ನಿಭಾಯಿಸುವ ಅಗತ್ಯವಿದೆ. await ಅಷ್ಟೇ.
ಅದಕ್ಕಾಗಿಯೇ ಒಂದೇ ವ್ಯಾಲ್ಯೂಟಾಸ್ಕ್ ಹಲವಾರು ಬಾರಿ ಕಾಯಲು ಸಾಧ್ಯವಿಲ್ಲ
Task 是可可以的名字。 ಬಹು ಬಳಕೆದಾರರು ಒಂದೇ ಒಂದಕ್ಕಾಗಿ ಕಾಯಬಹುದು Taskಕಾರ್ಯವನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ ನಂತರ, ಫಲಿತಾಂಶವನ್ನು ಸಹ ಉಳಿಸಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.
ValueTask ಅಂತಹ ವ್ಯವಸ್ಥೆ ಇಲ್ಲ. ಇದು ಒಂದೇ ರಚನೆಯಾಗಿದೆ, ಮತ್ತು ಕೆಳಗಿನ ಮೂರು ಸನ್ನಿವೇಶಗಳನ್ನು ಆಂತರಿಕವಾಗಿ ವ್ಯಕ್ತಪಡಿಸಬಹುದು:
- ನೀವು ಈಗಾಗಲೇ ಸಿಂಕ್ರೊನೈಸೇಶನ್ ಫಲಿತಾಂಶವನ್ನು ಪಡೆದುಕೊಂಡಿದ್ದೀರಿ. ಉದಾಹರಣೆಗೆ
ValueTask.FromResult(42)ನೇರವಾಗಿ42ಹಾಕಿದರುValueTask中. - 一个 ಪ್ರಗತಿಯಲ್ಲಿದೆ ಅಥವಾ ಪೂರ್ಣಗೊಂಡಿದೆ
Task/Taskಈ ಬಾರಿValueTaskಸರಿಯಾಗಿದೆTaskಪ್ಯಾಕೇಜಿಂಗ್, ಉದಾಹರಣೆಗೆnew ValueTask.(someTask) - 一个
IValueTaskSource,可以电影电影电影的电视的电视令牌。 ಈ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಮರುಬಳಕೆ ಮಾಡಬಹುದು,ಪ್ರತಿ ಬಾರಿಯೂ ತಪ್ಪಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ惍Task.
ಗಮನಿಸಿ: ಇದು ಹೇಳುತ್ತದೆ
ValueTask的全部了说,不是设计设计设计的设计了async“ಒಂದುasync ValueTaskವಿಧಾನ 也完全定件下载设计,ಉದಾಹರಣೆಗೆ, cache命中后 ಫಲಿತಾಂಶವನ್ನು ನೇರವಾಗಿ ಹಿಂತಿರುಗಿಸಿValueTask的 ಮೂಲ.
ಮೊದಲ ಎರಡು ಸನ್ನಿವೇಶಗಳು ಹಲವು ಅಳವಡಿಕೆಗಳಲ್ಲಿವೆ ಮತ್ತು ವಾಸ್ತವವಾಗಿ ಹಲವು ಬಾರಿ ಕಾಯಬಹುದು, ಆದರೆ ಕರೆ ಮಾಡಿದವರು ಅವರು ನಿಜವಾಗಿ ಯಾವ ರೀತಿಯನ್ನು ಪಡೆದರು ಎಂಬುದನ್ನು ಸಹಿ ವಿಧಾನದಿಂದ ನಿರ್ಣಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹಿಂದಿರುಗಿದ API ಮಾತ್ರ ValueTask,就 ಅನ್ನು ಮೂರನೇ ವ್ಯಕ್ತಿಯ ಪರಿಸ್ಥಿತಿಯ ನಿರ್ಬಂಧಗಳಿಗೆ ಬಳಸಬೇಕು.
ನಿಜವಾದ ಮಿತಿಯು ಬರುತ್ತದೆ ValueTask ಪ್ಯಾಕೇಜಿಂಗ್ IValueTaskSource 下载。 高吞吐 I/O 会把 IValueTaskSource 放进六生池中动用:ಒಮ್ಮೆ ಕಾರ್ಯಾಚರಣೆ ಪೂರ್ಣಗೊಂಡು ಬಳಕೆ ಪೂರ್ಣಗೊಂಡರೆ, ಅದೇ IValueTaskSource ನೀವು ಮುಂದಿನ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಪ್ರಾರಂಭಿಸಬಹುದು.ValueTask “ಇದು ಮೊದಲ ಕಾರ್ಯಾಚರಣೆ” ಎಂದು ಗುರುತಿಸಲು ಉಳಿಸಿದ ಆವೃತ್ತಿಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.
第 1 次操作:IValueTaskSource + token 17 -> ValueTask A
await A:消费结果
IValueTaskSource 被归还并开始第 2 次操作,token 变为 18
再次 await A:A 仍携带 token 17,已不再代表当前操作
ನೀವು ಇದ್ದರೆ IValueTaskSource 被天用后是于A, ಸಾಮಾನ್ಯವಾಗಿ ಅದು ವಿಫಲಗೊಳ್ಳುತ್ತದೆ ಏಕೆಂದರೆ 令牌 ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಇದನ್ನು ಮರುಬಳಕೆ ಮಾಡದಿದ್ದರೂ ಸಹ, ಇದು ಬಹು ಫಾಲೋ-ಅಪ್ ಕರೆಗಳ ನೋಂದಣಿಯನ್ನು ಸಹ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ನಿರ್ದಿಷ್ಟ ಕಾರ್ಯಕ್ಷಮತೆಯು ಅನುಷ್ಠಾನದ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿದೆ, ಮತ್ತು ಇದು “ಎರಡನೇ ಬಾರಿ ಸಾಮಾನ್ಯವಾಗಬಹುದು” ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿಲ್ಲ, ಮತ್ತು ಇದು ಕೆಲವು ರೀತಿಯ ವಿನಾಯಿತಿಯನ್ನು ಹೊರಹಾಕುತ್ತದೆ ಎಂದು ಊಹಿಸಲಾಗುವುದಿಲ್ಲ.
ಕೆಲವು ಏಕೆ ಇವೆ ಎಂಬುದನ್ನು ಇದು ವಿವರಿಸುತ್ತದೆ ValueTask 英语可以下载 ನಿರೀಕ್ಷಿಸಿ: 可以刚好包装了 Task,ಅಥವಾ ಸಿಂಕ್ರೊನೈಸೇಶನ್ ಫಲಿತಾಂಶವನ್ನು ಸ್ವಯಂ ಉಳಿಸಲಾಗಿದೆ ValueTask 的电影,是以下载件件最最最的设计:一个 ValueTask ನಿದರ್ಶನವನ್ನು ಒಮ್ಮೆ ಮಾತ್ರ ಬಳಸಬಹುದು.
var valueTask = reader.ReadAsync(cancellationToken);
// 正确:只消费一次。
var result = await valueTask;
// 不要再次 await valueTask,也不要再次调用 valueTask.AsTask()。
若英语英语说是最了者、英语新传经 Task.WhenAllಒಮ್ಮೆ ಪರಿವರ್ತಿಸಿ ಮತ್ತು ಅದನ್ನು ಉಳಿಸಿ Task(
Task task = reader.ReadAsync(cancellationToken).AsTask();
await Task.WhenAll(task, RecordCompletionAsync(task));
var result = await task;
他们以业多电影一个 Task,但气最最 Task ಬಹು ಕಾಯುವಿಕೆ ಮತ್ತು ಬಹು ವೀಕ್ಷಕರ ಭಾಷೆಗೆ ಬೆಂಬಲ AsTask(),可以可以可以设计设计都列的时间手机的用法。ಸ್ಟೀಫನ್ ಟಬ್ 的 ಮೌಲ್ಯ ಕಾರ್ಯದ ಏಕೆ, ಏನು ಮತ್ತು ಯಾವಾಗ ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು 仍 IValueTaskSource ವಿತರಣಾ ಹಿನ್ನೆಲೆ ತಪ್ಪಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ. ಹೆಚ್ಚಿನ ನಿರ್ಬಂಧಗಳು ValueTask API ದಸ್ತಾವೇಜನ್ನು ಉಲ್ಲೇಖಿಸಬಹುದು.
ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆ
ಕೆಳಗಿನ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ ManualResetValueTaskSourceCore ಮೊದಲ ಬಾರಿಗೆ ಕಾಯುವಿಕೆ ಪೂರ್ಣಗೊಂಡ ನಂತರ, ಕೋಡ್ ಅನ್ನು ತಕ್ಷಣವೇ ಅದೇ ಒಂದು ಜೊತೆ ನಕಲು ಮಾಡಲಾಗುತ್ತದೆ IValueTaskSource ಎರಡನೇ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರಚಿಸಿ, ನಂತರ ಮತ್ತೆ ನಿರೀಕ್ಷಿಸಿ ValueTask.
using System.Threading.Tasks.Sources;
var source = new ReusableOperation();
var first = source.CreateCompleted(1);
Console.WriteLine($"First result: {await first}");
// source 开始下一次操作,版本令牌发生变化。
_ = source.CreateCompleted(2);
try
{
Console.WriteLine($"Second result: {await first}");
}
catch (Exception exception)
{
Console.WriteLine($"{exception.GetType().FullName}: {exception.Message}");
}
public sealed class ReusableOperation : IValueTaskSource
{
private ManualResetValueTaskSourceCore _core;
public ValueTask CreateCompleted(int result)
{
_core.Reset();
_core.SetResult(result);
return new ValueTask(this, _core.Version);
}
int IValueTaskSource.GetResult(short token) => _core.GetResult(token);
ValueTaskSourceStatus IValueTaskSource.GetStatus(short token) =>
_core.GetStatus(token);
void IValueTaskSource.OnCompleted(
Action
ಗಣಕದಲ್ಲಿ .NET 10.0.0 ರನ್ ಮಾಡಿ, ಔಟ್ಪುಟ್:
First result: 1
System.InvalidOperationException: Operation is not valid due to the current state of the object.
ಅಸಹಜ ManualResetValueTaskSourceCore ನೀವು ಹಳೆಯ ಆವೃತ್ತಿಯನ್ನು ಕಂಡುಕೊಂಡಾಗ ಅದನ್ನು ಎಸೆಯಿರಿ. ValueTask ಬಹು ಕಾಯುವಿಕೆ ಬಾರಿ ಸಾಮಾನ್ಯ ಫಲಿತಾಂಶಗಳು; ವಿಭಿನ್ನ IValueTaskSource 可以下载手机。 ಇದು ಎರಡನೇ ಬಾರಿ ಕಾಯುವ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿಲ್ಲದಿರುವ ಕಾರಣವೂ ಆಗಿದೆ.
ಅದು ಏಕೆ ಯಶಸ್ವಿಯಾಗಿ ಪೂರ್ಣಗೊಂಡಿದೆ?
IsCompleted ದಿಕ್ಕಿಯ್ ಗುರಿಯಿಯು ಪ್ಪೈ Pending ಯಶಸ್ಸು, ವೈಫಲ್ಯ ಮತ್ತು ರದ್ದತಿ ಸೇರಿದಂತೆ ಸ್ಥಿತಿ.IsCompletedSuccessfully 则电影设设计手机手机电影电影,是以五电影 Result ಇದು ಸುರಕ್ಷಿತವಾಗಿದೆ.
ಈ ರೀತಿಯ ತೀರ್ಪು ಸೂಕ್ತವಾಗಿದೆ async ಕ್ಷಿಪ್ರ ಮಾರ್ಗದ ವಿಧಾನ: ಯಶಸ್ವಿ ಸಮಯ ಏಕಕಾಲಿಕ ಪ್ರಕ್ರಿಯೆ ಫಲಿತಾಂಶ ಮತ್ತು ತಕ್ಷಣದ ಹಿಂತಿರುಗುವಿಕೆ await,由云手机电影可以设计、ಅಸಹಜತೆ ಮತ್ತು ರದ್ದತಿ。
调用底层操作
-> IsCompletedSuccessfully ?
是:直接读取 Result,继续同步执行
否:调用局部异步方法,由 await 等待结果
外山时间可以不了设计说 asyncಇಲ್ಲದಿದ್ದರೆ, ಯಂತ್ರದ ಸ್ಥಿತಿಯನ್ನು ಉತ್ಪಾದಿಸಲು ಕಂಪೈಲರ್ ಇನ್ನೂ ಅಗತ್ಯವಿದೆ, ವೇಗದ ಮಾರ್ಗದ ಅರ್ಥವು ಚಿಕ್ಕದಾಗಿದೆ.
ನೀವು AsTask ಅನ್ನು ಏಕೆ ಕರೆಯುತ್ತೀರಿ?
ಈ ರೀತಿಯ ಬರವಣಿಗೆಯ ವಿಧಾನವು ಸಾಮಾನ್ಯವಾಗಿ ವಿಧಾನದಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ ಹಿಂತಿರುಗಿಸಬೇಕು Task 在地图像。 英语电视 AsTask() ಇದು ನನಗೆ ಅಲ್ಲ await ಉತ್ತಮ ValueTask 老成方方方是的的 Task.
.NET 10 ರ ASP.NET ಕೋರ್ ಇಲ್ಲಿದೆ src/Shared/ValueTaskExtensions/ValueTaskExtensions.cs 中用 GetAsTask 电视无时间可以 ValueTask(
public static Task GetAsTask(this in ValueTask valueTask)
{
if (valueTask.IsCompletedSuccessfully)
{
valueTask.GetAwaiter().GetResult();
return Task.CompletedTask;
}
return valueTask.AsTask();
}
ಈ ಎರಡು ಶಾಖೆಗಳು ವಿಭಿನ್ನ ಸಂದರ್ಭಗಳನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ನಿರ್ವಹಿಸುತ್ತವೆ:
- ವೇಗದ ಮಾರ್ಗ: ಸಿಂಕ್ರೊನೈಸಿಂಗ್ ಯಶಸ್ಸು, ಕರೆ
GetResult()ಬಳಕೆValueTask,再这些上海的Task.CompletedTask。 ಉದಾಹರಣೆಗೆAsTask()当ValueTask由IValueTaskSourceಬೆಂಬಲಿಸುವಾಗAsTask()ಹಂಚಿಕೊಳ್ಳಬೇಕಾಗಬಹುದುTask. - ಇತರ ಸಂದರ್ಭಗಳು: 未安全, ವೈಫಲ್ಯ ಅಥವಾ ರದ್ದತಿ,
AsTask()内容的一个可以下载的 ಅನುಸರಣೆ ಫಲಿತಾಂಶಗಳು, ಅಸಹಜ ಅಥವಾ ರದ್ದುಗೊಳಿಸುTaskವಿಧಾನ ರಿಟರ್ನ್ ಅನ್ನು ಭೇಟಿ ಮಾಡಿTask的约定.
ಯಾವುದೇ ವ್ಯವಹಾರ ಫಲಿತಾಂಶಗಳಿಲ್ಲದಿದ್ದರೂ, ಅದನ್ನು ಕರೆಯಬೇಕು GetResult()。 ಇದು ಕೇವಲ “ರೀಡ್ ರಿಟರ್ನ್ ಮೌಲ್ಯ” ಅಲ್ಲ, ಇದು ಕೆಲವು ಜನರಿಗೆ IValueTaskSource ಇದು ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ, ಇದು ಈ ಸಮಯವನ್ನು ಸಹ ತೋರಿಸುತ್ತದೆ ValueTask ಇದನ್ನು ಈಗಾಗಲೇ ಸೇವಿಸಲಾಗಿದೆ. ಆದ್ದರಿಂದ, ಕಾರ್ಯಾಚರಣೆ ಪೂರ್ಣಗೊಂಡ ಕಾರಣ, ಅದನ್ನು ನೇರವಾಗಿ ಬಿಟ್ಟುಬಿಡಲಾಗುವುದಿಲ್ಲ.
ಹೊರಗಿನ ಪದರದ ವಿಧಾನವೇ ಆಗಿದ್ದರೆ asyncಹಿಂತಿರುಗುವ ಅಗತ್ಯವಿಲ್ಲ Task ಸಾಮಾನ್ಯವಾಗಿ ಇನ್ನೂ ಬರೆಯಲಾಗಿದೆ:
await valueTask;
ಬದಲಿಗೆ await valueTask.AsTask()。 ಎರಡನೆಯದನ್ನು ಅನಗತ್ಯವಾಗಿ ಪರಿಚಯಿಸಬಹುದು Task 电影。 ಕೇವಲ ರಿಟರ್ನ್ ಪ್ರಕಾರ、ಸಂಯೋಜನೆ API (ಉದಾ Task.WhenAll) 或新面在电影手机手机 Task 时,才名前可以.
ASP.NET ಕೋರ್ MVC ಆಕ್ಷನ್ ರಿಟರ್ನ್ಸ್
.NET 10 ರ ASP.NET ಕೋರ್ MVC ನಲ್ಲಿ,src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvoker.cs ಹ್ಯಾಂಡ್ಲಿಂಗ್ ಆಕ್ಷನ್ ಮೆಥಡ್ ರಿಟರ್ನಿಂಗ್ ValueTask “ಫಲಿತಾಂಶವನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಉಳಿಸುವ, 异步时再再代” ಎಂಬ ಬರವಣಿಗೆಯ ವಿಧಾನವನ್ನು ಅಳವಡಿಸಿಕೊಂಡಾಗ:
private Task InvokeActionMethodAsync()
{
var objectMethodExecutor = _cacheEntry.ObjectMethodExecutor;
var actionMethodExecutor = _cacheEntry.ActionMethodExecutor;
var orderedArguments = PrepareArguments(_arguments, objectMethodExecutor);
var actionResultValueTask = actionMethodExecutor.Execute(
ControllerContext, _mapper, objectMethodExecutor, _instance!, orderedArguments);
if (actionResultValueTask.IsCompletedSuccessfully)
{
_result = actionResultValueTask.Result;
}
else
{
return Awaited(this, actionResultValueTask);
}
return Task.CompletedTask;
static async Task Awaited(
ControllerActionInvoker invoker,
ValueTask actionResultValueTask)
{
invoker._result = await actionResultValueTask;
}
}
ಆಕ್ಷನ್ ಮೆಥಡ್ ಸಿಂಕ್ರೊನಸ್ ಆಗಿ ಹಿಂತಿರುಗಿದರೆ IActionResult,MVC就电影电影电影电影上起发动 Task.CompletedTask。 ಕ್ರಿಯೆಯ ವಿಧಾನವನ್ನು ಇನ್ನೂ ಪೂರ್ಣಗೊಳಿಸದಿದ್ದರೆ ಮಾತ್ರ,才这些使用单步是件。 ವೈಫಲ್ಯ ಮತ್ತು ರದ್ದತಿಯು ಸಹ ಈ ಹಾದಿಯಲ್ಲಿ ನಡೆಯುತ್ತದೆ, ಆದ್ದರಿಂದ ಅಸಹಜತೆ ಇನ್ನೂ ಇರುತ್ತದೆ await 按电影的异步语义这些。
ASP.NET ಕೋರ್ MVC ಯ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಿಡುಗಡೆ ಮಾಡಲಾಗಿದೆ
ಅದೇ ResourceInvoker ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಿಡುಗಡೆ ಮಾಡುವಾಗ ಹಿಂತಿರುಗಿಸುತ್ತದೆ ValueTask。 ಇಲ್ಲಿ ಓದಬಹುದಾದ ಫಲಿತಾಂಶಗಳಿಲ್ಲದಿದ್ದರೂ, ಅವುಗಳು ಸಹ ಹಾದುಹೋಗುತ್ತವೆ IsCompletedSuccessfully ನೀವು ಕಾಯಬೇಕೆ ಎಂದು ನಿರ್ಧರಿಸಿ:
internal ValueTask ReleaseResourcesCore(IDisposable? scope)
{
Exception? releaseException = null;
ValueTask releaseResult;
try
{
releaseResult = ReleaseResources();
if (!releaseResult.IsCompletedSuccessfully)
{
return HandleAsyncReleaseErrors(releaseResult, scope);
}
}
catch (Exception exception)
{
releaseException = exception;
}
return HandleReleaseErrors(scope, releaseException);
static async ValueTask HandleAsyncReleaseErrors(
ValueTask releaseResult, IDisposable? scope)
{
Exception? releaseException = null;
try
{
await releaseResult;
}
catch (Exception exception)
{
releaseException = exception;
}
await HandleReleaseErrors(scope, releaseException);
}
}
ಅಧಿಕೃತ ಕೋಡ್: ResourceInvoker.cs。 ಬಿಡುಗಡೆಯ ಕಾರ್ಯಾಚರಣೆಯು ಯಶಸ್ವಿಯಾದಾಗ, ಕೋಡ್ ನಂತರದ ಬಿಡುಗಡೆಯ ತರ್ಕವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತದೆ. await ಅಸಹಜ ನಿರ್ವಹಣೆಯನ್ನು ಏಕೀಕರಿಸಿ.
HttpResponse.WriteAsync 中国电影这些进行
HttpResponseWritingExtensions.WriteAsync 通电影两山两市上新最好。 少先手机 StartAsync 下载下载设计安全;ಇದು ಪೂರ್ಣಗೊಂಡರೆ,就电影电影于。写完后,再把 FlushAsync ಹಿಂತಿರುಗಿ ValueTask ನಿಮ್ಮ ಮುಂದೆ GetAsTask.
public static Task WriteAsync(
this HttpResponse response,
string text,
Encoding encoding,
CancellationToken cancellationToken = default)
{
if (!response.HasStarted)
{
var startAsyncTask = response.StartAsync(cancellationToken);
if (!startAsyncTask.IsCompletedSuccessfully)
{
return StartAndWriteAsyncAwaited(
response, text, encoding, cancellationToken, startAsyncTask);
}
}
Write(response, text, encoding);
return response.BodyWriter.FlushAsync(cancellationToken).GetAsTask();
}
private static async Task StartAndWriteAsyncAwaited(
HttpResponse response,
string text,
Encoding encoding,
CancellationToken cancellationToken,
Task startAsyncTask)
{
await startAsyncTask;
Write(response, text, encoding);
await response.BodyWriter.FlushAsync(cancellationToken);
}
ಈ ಉದಾಹರಣೆಯು ತೋರಿಸುತ್ತದೆ, ವೇಗದ ಮಾರ್ಗವು ಕೇವಲ ಒಂದು ಪದರವಲ್ಲ. await 写法电影.
ಬೆಂಚ್ಮಾರ್ಕ್ ಪರೀಕ್ಷೆ: ಯಶಸ್ವಿ ವ್ಯಾಲ್ಯೂಟಾಸ್ಕ್ನ ಸಿಂಕ್ರೊನೈಸೇಶನ್
ಕೆಳಗೆ ಸಂಪೂರ್ಣ ಮಾನದಂಡದ ಕೋಡ್ ಇದೆ. .NET 10 ಕನ್ಸೋಲ್ ಯೋಜನೆಯಲ್ಲಿ BenchmarkDotNet ಅನ್ನು ಉಲ್ಲೇಖಿಸಿದ ನಂತರ, ಚಲಾಯಿಸಲು ಈ ಕೆಳಗಿನ ಆಜ್ಞೆಯನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ:
dotnet run -c Release
ಯೋಜನೆಯು BenchmarkDotNet ಅನ್ನು ಮಾತ್ರ ಉಲ್ಲೇಖಿಸಬೇಕಾಗಿದೆ:
Exe
net10.0
enable
enable
ಸಂಪೂರ್ಣ ಮಾನದಂಡದ ಕೋಡ್ ಈ ಕೆಳಗಿನಂತಿರುತ್ತದೆ:
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Running;
using System.Threading.Tasks.Sources;
BenchmarkRunner.Run();
[MemoryDiagnoser]
[SimpleJob(launchCount: 1, warmupCount: 5, iterationCount: 12, invocationCount: 10_000_000)]
public class ValueTaskAwaitBenchmarks
{
private readonly CompletedValueTaskSource _source = new();
[Benchmark(Baseline = true)]
public async ValueTask DirectAwait()
{
await _source.CreateCompleted();
}
[Benchmark]
public ValueTask FastPath()
{
var valueTask = _source.CreateCompleted();
if (valueTask.IsCompletedSuccessfully)
{
valueTask.GetAwaiter().GetResult();
return ValueTask.CompletedTask;
}
return AwaitSlowPath(valueTask);
}
[Benchmark]
public Task ConvertToTask()
{
return _source.CreateCompleted().AsTask();
}
[Benchmark]
public Task FastPathToTask()
{
var valueTask = _source.CreateCompleted();
if (valueTask.IsCompletedSuccessfully)
{
valueTask.GetAwaiter().GetResult();
return Task.CompletedTask;
}
return valueTask.AsTask();
}
private static async ValueTask AwaitSlowPath(ValueTask valueTask)
{
await valueTask;
}
}
public sealed class CompletedValueTaskSource : IValueTaskSource
{
private ManualResetValueTaskSourceCore _core;
public ValueTask CreateCompleted()
{
_core.Reset();
_core.SetResult(true);
return new ValueTask(this, _core.Version);
}
void IValueTaskSource.GetResult(short token) => _core.GetResult(token);
ValueTaskSourceStatus IValueTaskSource.GetStatus(short token) =>
_core.GetStatus(token);
void IValueTaskSource.OnCompleted(
Action
ಪರೀಕ್ಷಾ ಬಳಕೆ ManualResetValueTaskSourceCore ಸಿಮ್ಯುಲೇಶನ್ IValueTaskSource ಬೆಂಬಲ、但名合时消后成力最好电影的可用用数用。 ಇದು ನಿಖರವಾಗಿ IsCompletedSuccessfully ಇದು ಲಾಭದಾಯಕ ಸನ್ನಿವೇಶಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು. ಇನ್ನೂ ಪೂರ್ಣಗೊಂಡಿಲ್ಲದ ನಿಜವಾದ I/O ಅನ್ನು ಅನಿವಾರ್ಯವಾಗಿ ಫಾಲೋ-ಅಪ್ ಕರೆಯಲ್ಲಿ ನೋಂದಾಯಿಸಿಕೊಳ್ಳಬೇಕಾಗುತ್ತದೆ ಮತ್ತು ವೆಚ್ಚದ ಈ ಭಾಗವು ಈ ಮಾನದಂಡದ ವ್ಯಾಪ್ತಿಯಲ್ಲಿಲ್ಲ.
ನಾಲ್ಕು ರೀತಿಯ ಬರವಣಿಗೆಗಳ ಹೋಲಿಕೆ ಹೀಗಿದೆ:
| ವಿಧಾನ | ನಡವಳಿಕೆ |
|---|---|
DirectAwait |
async ValueTask ನೇರವಾಗಿ ವಿಧಾನ await valueTask. |
FastPath |
ಯಶಸ್ವಿ ಸಮಯ GetResult() ಮತ್ತು ಹಿಂತಿರುಗಿ ValueTask.CompletedTask; ಇಲ್ಲದಿದ್ದರೆ, ಸ್ಥಳೀಯ 异步 ವಿಧಾನವನ್ನು ಬಳಸಿ. |
ConvertToTask |
ನೇರ ಕರೆ valueTask.AsTask(). |
FastPathToTask |
ಯಶಸ್ವಿ ಸಮಯ GetResult() ಮತ್ತು ಹಿಂತಿರುಗಿ Task.CompletedTask; ಇಲ್ಲದಿದ್ದರೆ ಕರೆ ಮಾಡಿ AsTask(). |
ಕಾರ್ಯಾಚರಣಾ ಪರಿಸರ: ಮ್ಯಾಕೋಸ್ ಸಿಕ್ವೊಯಾ 15.7.7, ಆಪಲ್ ಸಿಲಿಕಾನ್ ಆರ್ಮ್64, ನೆಟ್ SDK 10.0.100, ನೆಟ್ 10.0.0, ಬೆಂಚ್ಮಾರ್ಕ್ಡಾಟ್ನೆಟ್ 0.15.8″.
| ವಿಧಾನ | ಅರ್ಥ | ಡೈರೆಕ್ಟ್ ಅವೈಟ್ ವಿರುದ್ಧ | ವಿತರಣಾ ನಿರ್ವಹಣೆ |
|---|---|---|---|
DirectAwait |
15.71 ಎನ್ಎಸ್ | 1.00 | 0 ಬಿ |
FastPath |
13.48 ಎನ್ಎಸ್ | 0.86 | 0 ಬಿ |
ConvertToTask |
12.90 ಎನ್ಎಸ್ | 0.82 | 0 ಬಿ |
FastPathToTask |
12.85 ಎನ್ಎಸ್ | 0.82 | 0 ಬಿ |
FastPath 比电影 await 少约 2.2 ns, ಸುಮಾರು 14% await ವಿತರಣೆ ಇಲ್ಲ. ಈ ಫಲಿತಾಂಶವು ಎಲ್ಲವನ್ನೂ ಅರ್ಥವಲ್ಲ ValueTask 都可以先手机电影电视。 ಕೇವಲ MVC, Kestrel, ಈ ರೀತಿಯ ಕರೆ ಆವರ್ತನವು ತುಂಬಾ ಹೆಚ್ಚು, ಸಿಂಕ್ರೊನೈಸಿಂಗ್ ಯಶಸ್ಸು ಮತ್ತು ಸಾಮಾನ್ಯ ಫ್ರೇಮ್ವರ್ಕ್ ಕೋಡ್, ಹೆಚ್ಚುವರಿ ಶಾಖೆಗೆ ಯೋಗ್ಯವಾಗಿದೆ.
ಈ ಪರೀಕ್ಷೆಯು ಮಧ್ಯದಲ್ಲಿದೆ ConvertToTask ಯಾವುದೇ ವಿತರಣೆ ಇಲ್ಲ, ಆದರೆ ಅದು ಎಲ್ಲವನ್ನೂ ಪ್ರತಿನಿಧಿಸುವುದಿಲ್ಲ AsTask() ಇದನ್ನು ಹೀಗೆ ಕರೆಯಿರಿ.ValueTask ನಿಜವಾದ ಮೂಲವು ಪರಿವರ್ತನೆ ವೆಚ್ಚದ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರಬಹುದು, ವಿಶೇಷವಾಗಿ ಕೆಲವರಿಂದ IValueTaskSource ಬೆಂಬಲವನ್ನು ಸಾಧಿಸುವಾಗ,AsTask() ಇದನ್ನು ಇನ್ನೂ ರಚಿಸಬಹುದು Taskಆದ್ದರಿಂದ, API ಮಾತ್ರ ಅಗತ್ಯವಿಲ್ಲ Taskಅಥವಾ ನೇರವಾಗಿ ಇರಬೇಕು await valueTask.
ಸಾರಾಂಶ
ಹೆಚ್ಚಿನ ಬಳಕೆದಾರರಿಗೆ, ಈ ಕೆಳಗಿನ ಕೋಡ್ ಅನ್ನು ನೇರವಾಗಿ ಬರೆಯಬಹುದು:
var result = await valueTask;
await 自然会电影设计可以可以。 ಹಸ್ತಚಾಲಿತವಾಗಿ ಪರಿಶೀಲಿಸಿ IsCompleted ಸಾಮಾನ್ಯವಾಗಿ, ಇದು ಕೆಲಸದ ಪ್ರಮಾಣವನ್ನು ಕಡಿಮೆ ಮಾಡುವುದಿಲ್ಲ, ಮತ್ತು ಇದು ವೈಫಲ್ಯ ಮತ್ತು ರದ್ದತಿ ಸಂದರ್ಭಗಳನ್ನು ಸಹ ಎದುರಿಸಬೇಕಾಗುತ್ತದೆ.
一个 ValueTask ಉದಾಹರಣೆ ಒಮ್ಮೆ AsTask()。 ನಿಮಗೆ ಬಹು ಕಾಯುವಿಕೆಗಳು ಅಗತ್ಯವಿದ್ದರೆ ಅಥವಾ ನೀವು ಫಲಿತಾಂಶಗಳಿಗಾಗಿ ಕಾಯಬೇಕಾದರೆ Task.WhenAll API ನಂತಹ, ಒಮ್ಮೆ ಕರೆ ಮಾಡಬೇಕು AsTask() ಉದಾಹರಣೆಗೆ Task.
ಬಯಸುವುದಿಲ್ಲ await ಕರೆ ಮಾಡಲು AsTask()。 ಕೇವಲ ಸಿಗ್ನೇಚರ್ ವಿಧಾನ, ಫ್ರೇಮ್ವರ್ಕ್ ಇಂಟರ್ಫೇಸ್ ಅಥವಾ API ಸಂಯೋಜನೆಯು ಸ್ಪಷ್ಟವಾಗಿ ಅಗತ್ಯವಿದೆ Task 时,才电影电影。
IsCompletedSuccessfully ಮುಖ್ಯವಾಗಿ .NET ರನ್ಟೈಮ್、ASP.NET ಕೋರ್, ಈ ರೀತಿಯ ಹೈ-ಫ್ರೀಕ್ವೆನ್ಸಿ ಕರೆ ಬೇಸ್ ಕೋಡ್ಗಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ. Result。 普通上海设计可以模演可以写法; ಯಶಸ್ವಿ ಮಾರ್ಗವನ್ನು ಸಿಂಕ್ರೊನೈಸ್ ಮಾಡುವುದು ಎಂದು ಕಾರ್ಯಕ್ಷಮತೆಯ ವಿಶ್ಲೇಷಣೆ ಮಾತ್ರ ಸಾಬೀತುಪಡಿಸಿದೆ hot点时,才电影用可以可以可以那一个技术。