मैं एक स्वयं के द्वारा होस्ट Owin पर्यावरण के भीतर एक ApiController में एक लंबा चल रहा कार्य (जैसे कि 4-5 मिनट) को चलाने के लिए चाहते हैं। हालांकि मैं एक प्रतिक्रिया (जैसे ही मैं लंबे समय से चल रहा है काम शुरू कर दिया) यह खत्म करने के लिए इंतजार किए बिना उस कार्य को शुरू करने के बाद वापस भेजना चाहते हैं। इस लंबे समय तक चलने वाले कार्य में HTTP के साथ कुछ लेना देना नहीं है और अनुक्रमिक रूप से कुछ विधियों को चलाता है जो बहुत अधिक समय ले सकते हैं।ApiController में दीर्घ परिचालन कार्य (वेबएपीआई, का उपयोग कर स्वयं के द्वारा होस्ट Owin)
मैं this ब्लॉग पोस्ट पर एक नजर है और QueueBackgroundWorkItem
को एक कोशिश देने का फैसला किया। हालांकि, मुझे यकीन है कि अगर यह पर्यावरण या उसका उपयोग करने के लिए आवश्यक Owin एक स्वयं की मेजबानी (कंसोल आवेदन) में इस पद्धति का उपयोग करना संभव है नहीं कर रहा हूँ। एक स्वयं की मेजबानी की सांत्वना आवेदन मुझे लगता है, आवेदन ही अनुरोध और एक ही AppDomain में चलने सभी अनुरोध प्रबंधन में (अनुप्रयोगों डिफ़ॉल्ट AppDomain, हम किसी भी नए AppDomain बनाने नहीं है), तो मैं बस में एक लंबा चल रहा है काम चला सकते हैं हो सकता है आग लगाना और भूलना फैशन, कुछ विशेष किए बिना?
वैसे भी, जब मैं QueueBackgroundWorkItem
उपयोग करते हैं, मैं हमेशा त्रुटि मिलती है:
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Operation is not valid due to the current state of the object.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
at System.Web.Hosting.HostingEnvironment.QueueBackgroundWorkItem(Func`2 workItem) at BenchMarkService.SmokeTestController.IsItWorking() in C:\Devel\Code\Projects\BenchMarkService\BenchMarkService\SmokeTestController.cs:line 18 at lambda_method(Closure , Object , Object[]) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
</StackTrace>
</Error>
इसके अलावा, मैं इतने पर this सवाल पाया और ईमानदार यह एक ही तरीका है कि प्राप्त करने के लिए के रूप में मेरे लिए भ्रामक एक छोटा सा लगता है होना करने के लिए IRegisteredObject
है या नहीं?
मैं सिर्फ एक स्वयं के द्वारा होस्ट आवेदन पत्र में एक लंबी चलने वाली कार्य चलाने के लिए कोशिश कर रहा हूँ और मुझे लगता है कि के बारे में किसी भी विचार की सराहना करते हैं। लगभग सभी संसाधन, मुझे मिले प्रश्न एएसपीनेट पर आधारित हैं और मुझे यकीन नहीं है कि कहां से शुरू करना है।
क्या यह कार्य (डेटाबेस में) कतारबद्ध करने का विकल्प नहीं है और कुछ सेवा इसे संभालने दें? –
हैंगफायर (https://www.hangfire.io/) कुछ ऐसा ही करता है जहां तक मुझे पता है।हालांकि, मैं इस सवाल से थोड़ा अलग मानता हूं। – Deniz