ยังไง Task.Yield
ทำงานภายใต้ฮู้ดอยู่ใน เสียงโมโน(mono)/WASM runtime (ซึ่งเป็นที่ถูกใช้โดย Blazor WebAssembly)?
เพื่อความชัดเจนฉันอยากจะเชื่อว่าฉันมีความเข้าใจขอ ยังไง Task.Yield
ทำงาน อยู่อข่ายส่วนเฟรมเวิร์กแล้ว.อข่ายส่วนกลาง เสียงโมโน(mono)implementation ไม่ได้ดูต่างไปใน nutshell มันมาพร้อไปนี้:
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();
}
}
}
ธรรมชาติทั้งหมดมันเกิดขึ้นที่เดียวกับเหตุการณ์วเธรดในเบราว์เซอร์,ดังนั้นฉันสงสัยว่ามันทำงานบนลดขั้นแล้ว
ฉันต้องสงสัยมันอาจจะใช้ประโยชน์จาอะไรอย่าง Emscripten น Asyncifyแต่ในที่สุดมันใช้บางอย่างของแพลตฟอร์มบนเว็บรูปแบบ api อยากรู้ตารางเวลา continuation เรียกกลับ? และถ้างั้นซึ่งหนึ่งสิ่ง(เหมือน queueMicrotask
, setTimout
, Promise.resove().then
เป็นต้)?
ปรับปรุงผมเพิ่งค้นพบว่า Thread.Sleep
คือการจัดเตรียมไว้เช่นกันและมันจริง ช่วงตึกเหตุการณ์วงเธรด
setTimeout
คุณช่วยอธิบายใหญ่วามแตกต่างชั้นมองเห็นตอนเวลาควงของawait new Promise(r => setTimeout(r, 0))
กับ JS interop กับเป็นเรื่องของawait Task.Yield
? คือมันเป็นข้อบกพร่องในการทดสอบ? blazorrepl.telerik.com/QlFFQLPF08dkYRbm30