5

मैं Azure Blob पर डेटा अपलोड करने के लिए MVC4 ApiController का उपयोग कर रहा हूं। यहां नमूना कोड है:एमवीसी 4 async ApiController में Task.Factory.StartNew का उपयोग करें?

public Task PostAsync(int id) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     // CloudBlob.UploadFromStream(stream); 
    }); 
} 

क्या यह कोड भी समझ में आता है? मुझे लगता है कि एएसपी.नेट पहले से ही एक कार्यकर्ता थ्रेड में अनुरोध संसाधित कर रहा है, इसलिए किसी अन्य थ्रेड में अपलोडफ्रॉमस्ट्रीम चलाना इस बात को समझने के लिए प्रतीत नहीं होता है क्योंकि अब यह इस विधि को चलाने के लिए दो धागे का उपयोग करता है (मुझे लगता है कि मूल कार्यकर्ता थ्रेड इस अपलोडफ्रेमस्ट्रीम के लिए प्रतीक्षा कर रहा है खत्म करने के लिए?)

तो मेरी समझ यह है कि अगर हम कुछ अंतर्निहित एसिंक विधियों जैसे HttpClient.GetAsync या SqlCommand.ExecuteReaderAsync का उपयोग कर रहे हैं तो एसिंक एपीकंट्रोलर केवल तभी समझ में आता है। वे विधियां संभवतः आंतरिक रूप से I/O प्राप्ति बंदरगाहों का उपयोग करती हैं ताकि वास्तविक कार्य करते समय यह थ्रेड को मुक्त कर सके। तो मुझे इस कोड को बदलना चाहिए?

public Task PostAsync(int id) 
{ 
    // only to show it's using the proper async version of the method. 
    return TaskFactory.FromAsync(BeginUploadFromStream, EndUploadFromStream...) 
} 

दूसरी ओर, अगर पोस्ट विधि में सब काम सीपीयू/स्मृति-गहन है, तो async संस्करण PostAsync अनुरोधों की प्रवाह क्षमता मदद नहीं करेगा। नियमित रूप से "सार्वजनिक शून्य पोस्ट (int आईडी)" विधि का उपयोग करना बेहतर हो सकता है, है ना?

मुझे पता है कि यह बहुत सारे प्रश्न हैं। उम्मीद है कि यह एएसपी.नेट एमवीसी में एसिंक उपयोग की मेरी समझ को स्पष्ट करेगा। धन्यवाद।

उत्तर

1

हां, जो कुछ आप कहते हैं वह सही है। पूरा बंदरगाहों और इस तरह के विवरण के साथ भी नीचे।

I assume the original worker thread is waiting for this UploadFromStream to finish?

केवल अपने कार्य धागा चल रहा है:

यहाँ एक छोटे से त्रुटि है। आप एसिंक पाइपलाइन का उपयोग कर रहे हैं। यह काम खत्म होने की प्रतीक्षा नहीं करता है, यह सिर्फ एक निरंतरता को हुक करता है। (बस HttpClient.GetAsync के साथ)।

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

  • कोई संबंधित समस्या नहीं^_^