कैसे करता है Task.Yield
काम में हुड के तहत मोनो/WASM रनटाइम (जो द्वारा इस्तेमाल किया जाता है Blazor WebAssembly)?
स्पष्ट करने के लिए, मुझे विश्वास है कि मैं एक अच्छी समझ है की कैसे Task.Yield
काम करता है । NET Framework और .नेट कोर. मोनो कार्यान्वयन ज्यादा अलग नहीं लगती है, संक्षेप में, यह नीचे आता है यह करने के लिए:
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, लेकिन अंत में, यह करता है के कुछ प्रकार का उपयोग वेब मंच एपीआई अनुसूची करने के लिए एक निरंतरता कॉलबैक? और अगर ऐसा है, जो वास्तव में (जैसे queueMicrotask
, setTimout
, Promise.resove().then
, आदि)?
अद्यतन, मैं अभी पता चला है कि Thread.Sleep
कार्यान्वित किया जाता है के रूप में अच्छी तरह से और यह वास्तव में ब्लॉक घटना पाश धागा
setTimeout
सकता है , तुम समझा है कि आप एक बहुत बड़ी विसंगति मैं देख रहा हूँ जब समय के एक पाशawait new Promise(r => setTimeout(r, 0))
जे एस के साथ interop बनाम एक पाश केawait Task.Yield
? वहाँ है में एक दोष का परीक्षण? blazorrepl.telerik.com/QlFFQLPF08dkYRbm30