2010-12-01 23 views
15

के साथ लागू लंबे समय तक चलने वाले कार्यों के लिए प्रगति पट्टी को कार्यान्वित करना एएसपी.नेट एमवीसी 2 में documentation on AsyncControllers पढ़ने के बाद, मुझे आश्चर्य है कि इस परिदृश्य में AJAX प्रगति पट्टी को लागू करने का सबसे अच्छा तरीका क्या है। ऐसा लगता है कि ट्यूटोरियल में यह बिल्कुल शामिल नहीं है।एएसपी.नेट एमवीसी 2 AsyncController

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

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

ऐसा करने का सबसे अच्छा तरीका क्या है?

धन्यवाद,

एड्रियन

+0

यह पूछने की तरह है कि आपको सामान्य अनुरोध के लिए प्रगति पट्टी क्यों नहीं मिलती है। जब आप इस बारे में सोचते हैं तो खुद को जवाब देना चाहिए। – nick

+2

@nick: वास्तव में नहीं। सामान्य अनुरोध लंबे समय तक नहीं चल रहे हैं। किसी को भी कुछ ऐसा करने के लिए प्रगति पट्टी की आवश्यकता नहीं होती है जो अधिकतर कुछ सेकंड लेती है। हालांकि, अगर आप एसिंक नियंत्रक का उपयोग कर रहे हैं, तो आप अनुरोध को लंबे समय तक लेने की उम्मीद करते हैं। और वह तब होता है जब आपको प्रगति पट्टी की आवश्यकता होती है। क्या मैं अकेला हूं जो इसे स्पष्ट करता है? –

+0

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

उत्तर

16

बहुत दिलचस्प सवाल! दरअसल ऐसा लगता है कि यह AsyncController के लिए कोई काम नहीं है। Async नियंत्रकों को सर्वर-साइड पर लंबे समय से चलने वाले एकल-HTTP-क्वेरी संचालन के लिए डिज़ाइन किया गया है। जब आप एसिंक एक्शन का उपयोग कर रहे हैं, तो यह आपको कुछ लंबे समय से चलने वाले ऑपरेशन के दौरान एएसपी.Net वर्कर थ्रेड जारी करने में मदद कर सकता है और इसे ऑपरेशन के दौरान अन्य अनुरोधों की सेवा करने की अनुमति देता है। लेकिन क्लाइंट-साइड पॉइंट व्यू से इससे कोई फर्क नहीं पड़ता, यह एसिंक नियंत्रक है या नहीं। क्लाइंट के लिए यह केवल एक HTTP अनुरोध है।

आपको अपने आवेदन में कुछ लंबी चल रही क्वेरी सेवा का उपयोग करके इसे फिर से डिजाइन करने की आवश्यकता है। कुछ

var operationId; 
function startOperation(data) { 
    $.post('/LongOperations/StartOperation', data, function(response) { 
     operationId = response; // store operationId 
     startOperationMonitoring(); // start 
    }, 'json'); 
} 

function startOperationMonitoring() { 
    // todo : periodically call updateOperationStatus() to check status at server-side 
} 

function updateOperationStatus() { 
    // todo : get result of GetOperationStatus action from controller 
    // todo : if status is 'running', update progress bar with value from server, if 'completed' - stop operation monitoring and call finishOperation() 
} 

function finishOperation() { 
    // todo : get result of GetOperationResult action from controller and update UI 
    // todo : call ClearOperation action from controller to free resources 
} 

यह बहुत ही बुनियादी अवधारणा है, देखते हैं:

public class LongOperationsController : Controller 
{ 
    public ActionResult StartOperation(OperationData data) 
    { 
     Guid operationId = Guid.NewGuid(); // unique identifier for your operation 
     OperationsService.DoStartOperation(operationId, data); // service starts to perform operation using separate thread 
     return new JsonResult(operationId); // operation id should be sent to client to allow progress monitoring 
    } 

    public ActionResult GetOperationStatus(Guid operationId) 
    { 
     var status = OperationsService.GetStatus(operationId); // this method returns some object, that describes status of operation (e.g. progress, current task etc.) 
     return new JsonResult(status); // returning it to client 
    } 

    public ActionResult GetOperationResult(Guid operationId) 
    { 
     var result = OperationsService.GetOperationResult(operationId); // this should throw exception if operation is not yet completed 
     return new JsonResult(result); 
    } 

    public ActionResult ClearOperation(Guid operationId) 
    { 
     OperationsService.ClearOperationResult(operationId); // we should delete operation result if it was handled by client 
     return true; 
    } 
} 

और यहाँ क्लाइंट-साइड कोड हैं, कि इस नियंत्रक के साथ बातचीत कर सकता है: यहाँ नियंत्रक के उदाहरण के लिए, कि इस तरह के कार्यप्रवाह की सेवा कर सकता है यहां मिस्ड आइटम हैं, लेकिन मुझे आशा है कि आपको मुख्य विचार मिलेगा। इसके अलावा यह आप पर निर्भर है इस प्रणाली के घटकों डिजाइन करने के लिए कैसे, उदाहरण के लिए है: OperationsService, या नहीं करने के लिए

  • उपयोग सिंगलटन;
  • कहां और कब तक ऑपरेशन परिणाम संग्रहीत किया जाना चाहिए (डीबी? कैश? सत्र?);
  • यह वास्तव में जब ग्राहक आपरेशन (उपयोगकर्ता बंद ब्राउज़र) आदि

बेस्ट भाग्य की निगरानी के लिए बंद कर दिया मैन्युअल रूप से करना करने के लिए संसाधनों और क्या जारी करने के लिए आवश्यक है!

+0

हाय मैस, आपके विस्तृत उत्तर के लिए धन्यवाद। यह वही दृष्टिकोण है जो मैं भी साथ आया था और जिसे मैंने अपने ओपी के तीसरे अनुच्छेद में वर्णित किया था। यह ठीक काम करता है, लेकिन यह एक बहुत ही कठिन कार्यान्वयन की तरह लगता है जो लगभग हर एसिंक नियंत्रक (अर्थात् एक प्रगति पट्टी) का हिस्सा होना चाहिए। मैंने सोचा होगा (या कम से कम उम्मीद है) कि एएसपी.नेट एमवीसी इससे बेहतर है और बॉक्स के बाहर एसिंक नियंत्रकों के लिए कुछ प्रकार की प्रगति संकेतक प्रदान करता है। –

+1

मैं सोच रहा हूं कि आप पूरी तरह से समझ नहीं पाए हैं कि एसिंक नियंत्रकों के लिए क्या डिज़ाइन किया गया है। यह एसिंक अनुरोधों के बारे में नहीं है, यह सर्वर पर लंबे संचालन के बारे में है। दुर्भाग्यवश HTTP सिंक्रोनस प्रोटोकॉल है और शुरुआत से इस तरह के उद्देश्यों के लिए डिज़ाइन नहीं किया गया था। –

+0

इसके अलावा, मेरी राय में समान अनुरोधों का उपयोग करके प्रगति के बारे में खुले राज्य और समय-समय पर मतदान सर्वर में एक अनुरोध रखने का सबसे अच्छा विचार नहीं है। –

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