어떻게 Task.Yield
에서 작업 후드에 모노/WASM 런타임 (에 의해 사용되는 Blazor WebAssembly)?
을 명확히 하고 내가 믿고 좋은 이해의 방법 Task.Yield
작동합 니다.NET 프레임워크 및.NET 핵심입니다. 모노 구현 하지 않는 모습이 훨씬 다른,간단히 말해서,그것은 이:
static Task Yield()
{
var tcs = new TaskCompletionSource<bool>();
System.Threading.ThreadPool.QueueUserWorkItem(_ => tcs.TrySetResult(true));
return tcs.Task;
}
놀랍게도,이 작품에서 Blazor WebAssembly,너무(온라인으):
<label>Tick Count: @tickCount</label><br>
@code
{
int tickCount = System.Environment.TickCount;
protected override void OnAfterRender(bool firstRender)
{
if (firstRender) CountAsync();
}
static Task Yield()
{
var tcs = new TaskCompletionSource<bool>();
System.Threading.ThreadPool.QueueUserWorkItem(_ => tcs.TrySetResult(true));
return tcs.Task;
}
async void CountAsync()
{
for (var i = 0; i < 10000; i++)
{
await Yield();
tickCount = System.Environment.TickCount;
StateHasChanged();
}
}
}
자연적으로,그것은 모든 일에는 동일한 이벤트 루프레드는 브라우저에서,그래서 그것이 어떻게 작동하는지 궁금해 낮은 수준에 있습니다.
나고 의심할 수 있습을 활용하여 무언가가 다음과 같 데비안의 Asyncify지만,결국,그것을 사용하여 어떤 종류의 웹 플랫폼 API 을 예약하려면 지속 콜백? 그렇다면,하나는 정확하게(아 queueMicrotask
, setTimout
, Promise.resove().then
,etc.)?
업데이트,나는 그냥 발견 Thread.Sleep
구현뿐만 아니라 실제로 블럭 이벤트 루프레드
setTimeout
수,당신을 설명하는 큰 차이가 나는 경우 타이밍의 루프await new Promise(r => setTimeout(r, 0))
JS interop 대의 루프await Task.Yield
? 은 거기에 결함을 테스트? blazorrepl.telerik.com/QlFFQLPF08dkYRbm30