बहुत दिलचस्प सवाल! दरअसल ऐसा लगता है कि यह 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, या नहीं करने के लिए
- उपयोग सिंगलटन;
- कहां और कब तक ऑपरेशन परिणाम संग्रहीत किया जाना चाहिए (डीबी? कैश? सत्र?);
- यह वास्तव में जब ग्राहक आपरेशन (उपयोगकर्ता बंद ब्राउज़र) आदि
बेस्ट भाग्य की निगरानी के लिए बंद कर दिया मैन्युअल रूप से करना करने के लिए संसाधनों और क्या जारी करने के लिए आवश्यक है!
स्रोत
2011-01-18 22:24:32
यह पूछने की तरह है कि आपको सामान्य अनुरोध के लिए प्रगति पट्टी क्यों नहीं मिलती है। जब आप इस बारे में सोचते हैं तो खुद को जवाब देना चाहिए। – nick
@nick: वास्तव में नहीं। सामान्य अनुरोध लंबे समय तक नहीं चल रहे हैं। किसी को भी कुछ ऐसा करने के लिए प्रगति पट्टी की आवश्यकता नहीं होती है जो अधिकतर कुछ सेकंड लेती है। हालांकि, अगर आप एसिंक नियंत्रक का उपयोग कर रहे हैं, तो आप अनुरोध को लंबे समय तक लेने की उम्मीद करते हैं। और वह तब होता है जब आपको प्रगति पट्टी की आवश्यकता होती है। क्या मैं अकेला हूं जो इसे स्पष्ट करता है? –
एक असिंक नियंत्रक के साथ इसका मतलब है कि कोई कार्य कहीं और जाता है - इसलिए आप इसे Async बनाते हैं और शेष कोड को निरंतर जारी रखने की अनुमति दे सकते हैं - इसमें से किसी के लिए लंबे समय तक चलने वाले कार्य होने की आवश्यकता नहीं है। बस मतलब है कि आप प्रदर्शन में सुधार कर सकते हैं। एक वेब अनुरोध के साथ - ग्राहक द्वारा कोई लाभ देखा जाएगा।क्या आप अकेले हैं क्या वह कुछ कहता है? आप क्या उम्मीद कर रहे हैं सर्वर कई प्रतिक्रियाएं भेजने के लिए है ताकि आपको प्रगति पट्टी मिल सके - जो आपके प्रदर्शन लाभों को अस्वीकार कर देगी और वास्तव में बेवकूफ व्यवहार जोड़ देगा। – nick