2011-03-01 14 views
5

जब उपयोगकर्ता कुछ करता है (कई रिपोर्ट उत्पन्न करता है) तो हमारे पास कुछ लंबे समय तक चलने वाला ऑपरेशन फ़ायरिंग होता है। हम नहीं चाहते हैं कि उपयोगकर्ता तब तक प्रतीक्षा करे जब तक कि उन रिपोर्टों को उत्पन्न नहीं किया जाता है। क्या नौकरियों को लागू किए बिना इसे पूरा करने का कोई त्वरित तरीका है? शायद इस तरह धागे का उपयोग कर? या यह सुरक्षित नहीं है?लंबे समय तक चलने वाले कार्यों की प्रतीक्षा न करें ASP.NET MVC

public ActionResult About() 
    { 
     Thread thread = new Thread(new ThreadStart(MuchWork)); 
     thread.Start(); 
     return View(); 
    } 

    public void MuchWork() 
    { 
     Thread.Sleep(10000); 

     Thread.Sleep(4000); 
    } 

उत्तर

0

यह सुरक्षित नहीं है। ऑपरेशन के दौरान आपके सर्वर क्रैश होने के बारे में क्या? और उपयोगकर्ता को ऑपरेशन नहीं पता था कि कभी नहीं किया गया था।

सामान्य रूप से, वर्कफ़्लो/लगातार तंत्र उसमें मदद करेगा, लेकिन आपको वास्तव में यहां कैस्ट्रैफ़िक परिदृश्यों के लिए अपने व्यवसाय/उपयोगकर्ता अनुभव मामले के बारे में सोचना होगा।

+0

असुरक्षित के साथ मेरा मतलब था कि यह संभव है कि आईआईएस द्वारा एसिंक थ्रेड का निपटारा किया जाए जब कॉलिंग अनुरोध कुछ समय समाप्त हो गया हो। वास्तव में एक अच्छा अपवाद हैंडलिंग/लॉगिंग होना आवश्यक होगा। हमारी स्थिति में यदि सर्वर क्रैश हो जाएगा तो उपयोगकर्ता विनाशकारी नहीं होगा क्योंकि उपयोगकर्ता यह देखेगा कि उसकी रिपोर्ट वहां नहीं है। – MichaelD

0

शायद थ्रेडपूल या टीपीएल का उपयोग करें ताकि आप स्थिति की जांच कर सकें और थ्रेड-दुर्व्यवहार न करें? 'चेक' द्वारा मेरा मतलब है कि आप इनमें से कितने अनुरोध पहले से ही किसी दूसरे को कताई करने से पहले चल रहे हैं।

आईएम geussing कि ऑपरेशन का परिणाम कुछ डीबी तालिका में लिखा है, तो उपयोगकर्ता स्थिति मतदान और देख सकते हैं?

+0

हां, परिणाम डेटाबेस में संग्रहीत रिपोर्ट हैं, उपयोगकर्ता उपलब्ध होने पर उन रिपोर्ट को देखने में सक्षम हैं। – MichaelD

+0

आप इसे Async कॉल का उपयोग करके प्राप्त कर सकते हैं। मुझे नहीं लगता कि थ्रेडिंग आपके उदाहरण के आधार पर आवश्यक है। हालांकि मुझे बड़ी तस्वीर याद आ रही है .. लेकिन मुझे दृढ़ता से लगता है कि यह असिनक कॉल के साथ हासिल किया जा सकता है। – sajoshi

+0

Async कॉल अभी भी वर्तमान अनुरोध के लिए अवरुद्ध कर रहे हैं। अगर मैं सही ढंग से समझ गया, तो async कॉल स्केलेबिलिटी के लिए बनाए जाते हैं, वर्तमान धागे के लिए त्वरित प्रतिक्रिया समय के लिए नहीं। (एसिंक कॉल पूर्ण होने पर दृश्य वापस किया जाता है) – MichaelD

2

फिल हैक द्वारा The Dangers of Implementing Recurring Background Tasks In ASP.NET पोस्ट देखें जहां वह वर्णन करता है कि IRegisteredObject interface का उपयोग करते हुए एक psuedo-job शेड्यूलर को कैसे है IIS/AppPool बंद करने के मुद्दों को सीमित करने के लिए।

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