यहाँ एक सरल WinForms अनुप्रयोग है:TaskScheduler.Current के व्यवहार को समझना
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
var ts = TaskScheduler.FromCurrentSynchronizationContext();
await Task.Factory.StartNew(async() =>
{
Debug.WriteLine(new
{
where = "1) before await",
currentTs = TaskScheduler.Current,
thread = Thread.CurrentThread.ManagedThreadId,
context = SynchronizationContext.Current
});
await Task.Yield(); // or await Task.Delay(1)
Debug.WriteLine(new
{
where = "2) after await",
currentTs = TaskScheduler.Current,
thread = Thread.CurrentThread.ManagedThreadId,
context = SynchronizationContext.Current
});
}, CancellationToken.None, TaskCreationOptions.None, scheduler: ts).Unwrap();
}
}
}
डिबग ouput (बटन क्लिक होने): TaskScheduler.Current
क्यों है बदल रहा है:
{ where = 1) before await, currentTs = System.Threading.Tasks.SynchronizationContextTaskScheduler, thread = 9, context = System.Windows.Forms.WindowsFormsSynchronizationContext } { where = 2) after await, currentTs = System.Threading.Tasks.ThreadPoolTaskScheduler, thread = 9, context = System.Windows.Forms.WindowsFormsSynchronizationContext }
सवाल SynchronizationContextTaskScheduler
से ThreadPoolTaskScheduler
से await
के बाद यहां?
यह अनिवार्य रूप से व्यवहार TaskCreationOptions.HideScheduler
await
निरंतरता के लिए प्रदर्शित करता है, जो मेरी राय में अप्रत्याशित और अवांछनीय है।
AspNetSynchronizationContext and await continuations in ASP.NET:
यह सवाल मेरा एक और सवाल से शुरू हो रहा किया गया है।
इस तरह मैंने सोचा कि यह काम करता है लेकिन कुछ और जानकारी के बिना टिप्पणी नहीं करना चाहता था। +1। –
मैं देखता हूं, स्पष्ट रूप से यह है कि 'टास्कवाइटर' कैसे काम करता है। आईएमओ, जो डिजाइन "फ्लोइंग" के लिए आया है, 'टास्कशेड्यूलर। कंटेंट' बल्कि भ्रमित है: आम तौर पर यह नहीं है कि आप तर्कसंगत रूप से यह अपेक्षा करते हैं। – Noseratio
सहमत; 'TaskScheduler.Current' को दिमाग में गतिशील समांतरता के साथ डिजाइन किया गया था, ताकि बाल कार्य शेड्यूलर को उनके मूल कार्यों से प्राप्त कर सकें। यह डिफ़ॉल्ट व्यवहार async कार्यों के लिए भ्रमित है, इसलिए मैं प्रत्येक 'StartNew' और' ContinueWith' में शेड्यूलर को स्पष्ट रूप से निर्दिष्ट करने का आग्रह करता हूं। –