2015-05-30 12 views
8

कहें कि मेरे पास Repository कक्षा है जिसमें DbContext है।आपको कार्य का इंतजार कब करना चाहिए?

public async Task<T> CreateAsync(T obj) 
{ 
    var o = _dbSet.Add(obj); 
    await _dbContext.SaveChangesAsync(); 
    return o; 
} 

एक Service वर्ग मैं इस विधि का उपयोग एक वस्तु बनाने के लिए: इस वर्ग में मैं एक विधि है

public async Task<MyObject> Create() 
{ 
    return await _repository.CreateAsync(new MyObject()); 
} 

और अंत में मेरी एपीआई नियंत्रक MyObjectController में मैं बहुत की तरह इस वस्तु लौट:

public async Task<IHttpActionResult> Get() 
{ 
    return Ok(await _service.Create()); 
} 

मैं इन सभी async और await कीवर्ड के बारे में उलझन में हूं। मुझे पता है कि Task प्रतीक्षा योग्य है। क्या इसका मतलब यह है कि मैं CreateAsync से CreateAsync या Create में प्रतीक्षा किए बिना Task वापस कर सकता हूं और फिर अंत में Get में इसका इंतजार कर सकता हूं? क्या इसका मेरे आवेदन पर नकारात्मक प्रभाव पड़ता है कि मैं उदाहरण में ऐसा इंतजार कर रहा हूं?

उत्तर

4

क्या इसका मतलब यह है कि मैं CreateAsync से कार्य को वापस नहीं कर सकता, न तो CreateAsync या Create में प्रतीक्षा किए बिना और फिर आखिरकार इसे प्राप्त करने का इंतजार कर रहा हूं?

हाँ आप यह कर सकते हैं, यह वास्तव में अधिक कुशल है। अगर आप अपने प्रतीक्षा कर रहा है कर के रूप में आप उन्हें कर रहे हैं, प्रत्येक अतुल्यकालिक विधि एक राज्य मशीन जो अधिक कोड और अधिक संदर्भ

स्विचिंग यह अपने आवेदन पर एक नकारात्मक प्रभाव है कि मैं में की तरह मेरे प्रतीक्षा कर रहा है कर है इसका मतलब है उत्पन्न होगा उदाहरण?

राज्य मशीन और संदर्भ स्विचिंग के कारण थोड़ा सा प्रदर्शन जुर्माना होगा। लागत आम तौर पर कॉल की लागत से काफी कम होती है, लेकिन यह सब अंत में बढ़ जाती है। Async Performance: Understanding the Costs of Async and Await इस विषय के बारे में एक अच्छा लेख है।

जैसा कि @ रिचर्ड स्ज़ले द्वारा इंगित किया गया है, बस यह सुनिश्चित करें कि आप अंततः await कार्य करते हैं अन्यथा जो भी अपवाद होता है वह अव्यवस्थित रहता है और निगल जाएगा।

+0

यह ध्यान देने योग्य है कि का इंतजार कर के बिना एक टास्क लौटने के लिए नकारात्मक पक्ष यह है कि लायक है की जरूरत है मुझे जानते हैं प्रश्न में विधि एसिंक कॉलस्टैक में नहीं होगी यदि कोई अपवाद –

+0

अच्छा बिंदु फेंक दिया गया है, लेकिन उसने कहा था कि वह अंततः इसे 'गेट' विधि में इंतजार कर रहा है, इसलिए अपवाद फेंक दिया जाएगा, लेकिन मैं इसे स्पष्ट रूप से इंगित करूंगा। –

+0

अपवाद को निगल नहीं दिया जाएगा, लेकिन जिस पद्धति का इंतजार नहीं किया गया वह एसिंक कॉलस्टैक पर दिखाई नहीं देगा (जो चीजों को डीबग करना अधिक कठिन बना सकता है) –

0

async और प्रतीक्षा का उपयोग तब किया जाता है जब आप असीमित रूप से चलाने की विधि चाहते हैं। इंतजार के बिना async पूरा करने के लिए इंतज़ार कर रहा है एक तुल्यकालिक

async तरीकों लौट कार्य या शून्य

इतना इंतजार एक विधि से पहले प्रयोग किया जाता है कि वापस जाने के कार्य

अपने प्राप्त विधि को पूरा करने के कार्य के लिए इंतजार का इंतजार है आपके create() कार्य जो createAsync कार्य

और अन्य को पूरा करने के लिए प्रतीक्षा करता है।

_dbContext।SaveChangesAsync() async विधि है तो aaawait आवश्यक है, वरना यह ओ

गलत वापस आ सकते हैं अगर आप किसी भी अधिक स्पष्टीकरण

+0

मुझे पूरा यकीन है कि ओपी जानता है कि क्या इंतजार/एसिन करता है। उनका सवाल अधिक था "क्या मुझे एक प्रतीक्षा की प्रतीक्षा करनी चाहिए" –

संबंधित मुद्दे