का उपयोग कर this link के अनुसार:async/इंतजार deadlocking जब एक SynchronizationContext
आप का इंतजार कीवर्ड के साथ एक विधि पर इंतजार कर रहे हैं जब, संकलक आप की ओर से में कोड का गुच्छा उत्पन्न करता है। इस कार्रवाई के प्रयोजनों में से एक यूआई थ्रेड के साथ सिंक्रनाइज़ेशन को संभालने के लिए है। इस विशेषता का प्रमुख
घटकSynchronizationContext.Current
जो वर्तमान थ्रेड के लिए तुल्यकालन संदर्भ हो जाता है।
SynchronizationContext.Current
वातावरण में हो पर निर्भर करता है आबादी है। टास्क केGetAwaiter
विधि के लिए
SynchronizationContext.Current
ऊपर लग रहा है। यदि वर्तमान समन्वयन संदर्भ अशक्त नहीं है, निरंतरता कि awaiter के लिए पारित हो जाता है कि कि तुल्यकालन संदर्भ के लिए वापस पोस्ट कर दिया जाएगा।जब एक विधि है, जो नए अतुल्यकालिक भाषा सुविधाओं का उपयोग करता, एक अवरुद्ध फैशन में लेने वाली है, तो आप अगर
आप एक उपलब्धSynchronizationContext
एक गतिरोध के साथ खत्म हो जाएगा। जब आप एक अवरुद्ध फैशन (प्रतीक्षा विधि के साथ कार्य पर इंतजार कर या कार्य के परिणाम संपत्ति से सीधे परिणाम लेने) में लेने वाली ऐसी तरीके हैं, आप एक ही समय में मुख्य थ्रेड रोकेंगे। अंत में टास्क ThreadPool में है कि विधि के अंदर पूरा करता है, यह क्योंकिSynchronizationContext.Current
उपलब्ध है और कब्जा कर लिया है मुख्य थ्रेड वापस करने के लिए पोस्ट करने के लिए जारी रखने के आह्वान करने के लिए जा रहा है। लेकिन यहां एक समस्या है: यूआई थ्रेड अवरुद्ध है और आपके पास डेडलॉक है!
public class HomeController : Controller
{
public ViewResult CarsSync()
{
SampleAPIClient client = new SampleAPIClient();
var cars = client.GetCarsInAWrongWayAsync().Result;
return View("Index", model: cars);
}
}
public class SampleAPIClient
{
private const string ApiUri = "http://localhost:17257/api/cars";
public async Task<IEnumerable<Car>> GetCarsInAWrongWayAsync()
{
using (var client = new HttpClient())
{
var response = await client.GetAsync(ApiUri);
// Not the best way to handle it but will do the work for demo purposes
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsAsync<IEnumerable<Car>>();
}
}
}
मैं मुसीबत ऊपर बयान की बोल्ड हिस्सा समझ है, लेकिन जब मैं कोड ऊपर का परीक्षण, यह उम्मीद के रूप में गतिरोध। लेकिन मुझे अभी भी समझ में नहीं आ रहा है कि यूआई थ्रेड क्यों अवरुद्ध है?
इस मामले में, उपलब्ध SynchronizationContext
क्या है? क्या यह यूआई थ्रेड है?
[यहां] से है (http://www.tugberkugurlu.com/archive/asynchronousnet-client-libraries-for-your-http-api-and-awareness: उचित ठीक बदलने के लिए
CarsSync
है के- async-का इंतजार-स-बुरा प्रभाव)? यदि ऐसा है, तो आपके प्रश्न में एक लिंक शामिल करना और यह इंगित करना अच्छा होगा कि इसमें से अधिकांश एक उद्धरण है। –यह आपके सवाल का सीधा जवाब नहीं है, लेकिन अगर आप अपने नियंत्रक कार्रवाई परिणाम 'टास्क बनाने' इसे नीचे सभी तरह async हो सकता है (जो ASP.NET धागा उपयोग के संबंध में बेहतर मापता है) –
@Damien_The_Unbeliever हाँ, मैं लिंक धन्यवाद – nainaigu