6

में निष्पादन है या नहीं, मेरे पास एएसपी.नेट एमवीसी 3 एप्लीकेशन है। मैं AsyncController का उपयोग कर रहा हूँ और नए धागे बना रहा हूँ। क्या यह सत्यापित करने का कोई तरीका है कि मैं ASP.NET थ्रेड पूल की बजाय I/O समापन बंदरगाहों का उपयोग कर रहा हूं?कैसे बताएं कि एमवीसी असिंक कंट्रोलर थ्रेड एएसपी.नेट पूल या आई/ओ प्राप्ति पोर्ट

क्या थ्रेड में कोई संपत्ति है। कंटेंट थ्रेड या कहीं और मैं यह पहचानने के लिए जांच सकता हूं कि थ्रेड कहां चल रहा है?

यहाँ कोड का एक उदाहरण है कि मैं

public class HomeController : AsyncController 
{ 
    public void CarsComplexAsync(string make) 
    { 
     AsyncManager.OutstandingOperations.Increment(2); 

     System.Diagnostics.Debug.WriteLine("Enter CarsComplexAsync: " + DateTime.Now); 

     Action getCarsAsync =() => 
     { 
      List<Car> cars = CarService.GetCars(make); 
      AsyncManager.Parameters["cars"] = cars; 
      AsyncManager.OutstandingOperations.Decrement();  
     }; 


     Action getTrucksAsync =() => 
     { 
      List<Car> trucks = CarService.GetTrucks(make); 
      AsyncManager.Parameters["trucks"] = trucks; 
      AsyncManager.OutstandingOperations.Decrement(); 
     }; 


     getCarsAsync.BeginInvoke(null, null); 
     getTrucksAsync.BeginInvoke(null, null); 
    } 

public ActionResult CarsComplexCompleted(List<Car> cars, List<Car> trucks) 
{ 
cars.AddRange(trucks); 
return View(cars); 
} 

public static class CarService 
{ 
    private static List<Car> _cars = new List<Car> 
       { 
        new Car{ Make = "Ford", Model = "F-150", Color = "White", Year = 2010}, 
        new Car{ Make = "Chevy", Model = "Camero", Color = "Black", Year = 1984}, 
        new Car{ Make = "Peugeot", Model = "406 Coupe", Color = "White", Year = 2010}, 
        new Car{ Make = "Dodge", Model = "Charger", Color = "Red", Year = 1974} 
       }; 

    public static List<Car> GetCars(string model) 
    { 
     Thread.Sleep(5000); 
     List<Car> cars = _cars; 
     return cars; 
    } 

    public static List<Car> GetTrucks(string make) 
    { 
     Thread.Sleep(5000); 
     List<Car> cars = _cars; 
     return cars; 
    } 
} 

उत्तर

8

को क्रियान्वित कर रहा हूँ वहाँ है कि मुझे लगता है मैं उपयोग कर रहा हूँ मान्य करने के लिए एक रास्ता है/हे एएसपी.नेट थ्रेड पूल के बजाय पूरा बंदरगाहों?

आपके कोड को देखे बिना नहीं, क्योंकि यह आपके द्वारा उपयोग किए जा रहे एपीआई पर निर्भर करेगा।

उदाहरण के लिए HttpWebRequest.BeginGetResponse I/O प्राप्ति बंदरगाहों का उपयोग करता है। दूसरी तरफ यदि आपके पास कुछ सीपीयू गहन कार्य है जो आप एक अलग थ्रेड पर चल रहे हैं जिसे आपने मैन्युअल रूप से बनाया है तो आप I/O प्राप्ति बंदरगाहों का उपयोग नहीं कर रहे हैं।

क्या थ्रेड में कोई संपत्ति है। कंटेंट थ्रेड या कहीं और मैं यह पहचानने के लिए जांच सकता हूं कि थ्रेड कहां चल रहा है?

एक प्राप्ति बंदरगाह का मतलब है कि कोई धागा नहीं है क्योंकि यदि कोई थ्रेड था जैसे कि आप थ्रेड पर चल रहे थे। असल में I/O प्राप्ति बंदरगाहों का तरीका यह है कि आप कुछ I/O ऑपरेशन शुरू करते हैं और एक सीपी इसके साथ पंजीकृत होता है, फिर आप सभी धागे मुक्त करते हैं और वापस आते हैं। ऑपरेशन के निष्पादन के दौरान आपके आवेदन में कोई धागा नहीं है। एक बार ऑपरेशन बंदरगाह को पूरा करने के बाद संकेत दिया जाता है और अनुरोध समाप्त करने के लिए पूल से क्रेता/खींचा जाता है।

+0

@ डारिन: मैं कोड –

+0

कोड शामिल करने के लिए अपना प्रश्न अपडेट करता हूं, शायद मुझे फ़्रांस में बनाई गई कार को जोड़ना चाहिए था। –

+0

@ बरदेव, अब आपने अपना उदाहरण दिखाया है, इसमें कोई I/O प्राप्ति बंदरगाह शामिल नहीं है। ऑपरेशन पूल से धागे पर निष्पादित किया जाता है जिसे उनके निष्पादन के दौरान एकाधिकार किया जा रहा है। यहां एक [उदाहरण]] (http://msdn.microsoft.com/en-us/library/ee728598.aspx) एक AsyncController का है जो दूरस्थ वेब सेवा को कॉल करता है और I/O प्राप्ति बंदरगाहों का उपयोग करता है। आईओसीपी का उपयोग अक्सर वेब सेवा कॉल, डेटाबेस कॉल और स्ट्रीम IBO के साथ फ़ाइल I/O जैसे रिमोट सिस्टम से निपटने के दौरान किया जाता है। ... –

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