c# - Start ManualResetEvent from Task.Factory.StartNew freeze my UI -
कृपया इस समारोह पर एक नज़र डालें:
निजी ManualResetEvent _manualResetEvent; सार्वजनिक शून्य DoWork (दशमलव छोरों, दशमलव विलंब) {_manualResetEvent = नया मैनुअलआरसेटसेट (गलत); _tokenSource = नया रद्दकरण टोकनसौर (); Var टोकन = _tokenSource.Token; Task.Factory.StartNew (() = & gt; {try {Parallel.ForEach (_indexedSource, नई ParallelOptions {MaxDegreeOfParallelism = parallelThreads // समानांतर सूत्र}, फ़ाइल = & gt की संख्या सीमित करें; {if (token.IsCancellationRequested) वापसी; // काम करो ...});} पकड़ (अपवाद) {}}, _tokenSource.Token, TaskCreationOptions.None, TaskScheduler.Default) .ContinueWith (टी = & gt; {_loopCounter ++, अगर (_loopCounter & LT; लूप & amp; & amp; _shouldContinue Iteration.LoopsDelay * 1000); // कर काम;) // यहाँ मैं अपने टाइमर {if (! _manualResetEvent.WaitOne ((पूर्णांक Iteration.LoopsDelay = 0) {if (StartTimerLoopDelayEventHandler = नल) StartTimerLoopDelayEventHandler ()) शुरू करना चाहते हैं ... DoWork (लूप, देरी);} else // कर काम ... DoWork (लूप, देरी);} else {// खत्म ... अगर (! OnFinishWorkEventHandler = नल) OnFinishWorkEventHandler (यह, EventArgs.Empty) ;}}, टास्क शेड्यूलर.फ़ॉर्म कंट्रेंट सिंक्रोनियाजेशन कंसोर्ट () यूआई धागे से जारी रखने के साथ (अपडेट यूआई); } यह फ़ंक्शन मेरी फाइल चलाता है और यह जांचने के बाद कि क्या अगले लूप से पहले देरी है या नहीं और मामले में आग लगने की घटना में विलंब होता है:
यदि (StartTimerLoopDelayEventHandler! = नल) StartTimerLoopDelayEventHandler (); यह घटना अपने मुख्य रूप से मेरे टाइमर प्रारंभ लेकिन मेरी समस्या यह है कि मेरी यूआई ठंड है
आप UI सूत्र से उस मैन्युअल रीसेट ईवेंट पर प्रतीक्षा कर रहे हैं। इसका मतलब है कि आप इसे सेट होने तक ब्लॉक करने जा रहे हैं, और जब तक यह खत्म नहीं होता तब तक UI कुछ भी करने की अनुमति नहीं देता। यह यूआई को अवरुद्ध कर रहा है; आप ऐसा नहीं करना चाहते आपको इस एसिंक्रोनस से निपटना चाहिए; कार्य पर एक एमआरई को पकड़ने के बजाय ताकि आप उस कार्य पर निरंतरता जोड़ सकते हैं।
Comments
Post a Comment