WPF टाइमर सी # टाइमर की तरह


177

मुझे एक नियंत्रण कहां मिल सकता है जो WPF में C # टाइमर कंट्रोल जैसा है?

जवाबों:


325

सामान्य WPF टाइमर है DispatcherTimer, जो एक नियंत्रण नहीं है, लेकिन कोड में उपयोग किया जाता है। यह मूल रूप से WinForms टाइमर की तरह ही काम करता है:

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();


private void dispatcherTimer_Tick(object sender, EventArgs e)
{
  // code goes here
}

DispatcherTimer पर अधिक यहाँ पाया जा सकता है


नमस्ते, मैं प्रेषण टाइमर का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे यह नहीं मिल रहा है कि यह मेरी बुद्धि में है क्या इसका कोई संदर्भ है जिसे मुझे इसका उपयोग करने के लिए जोड़ा जाना चाहिए?
योहन

2
जिस तरह से आपने अंतराल निर्धारित किया है, वह मेरी राय में मिलीसेकंड से बेहतर है।
जेएल

जब आप अपना फ़ॉर्म बंद करते हैं, तो डिस्पैचर को कॉल करें। टाइमर का WinForms संस्करण स्वचालित रूप से करता है। (यह टाइमर को एक नियंत्रण बनाने का लाभ है।) यदि आपके पास मेमोरी लीक नहीं है और संभवतः अन्य बग हैं।
ट्रेड-आइडिया फिलिप

7
@ जेएल एह? उस कोड की व्याख्या करना असंभव है। दूर बेहतर हैvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
जिम बेल्टर

12

डिस्पैचर के साथ आपको शामिल करना होगा

using System.Windows.Threading;

यह भी ध्यान दें कि यदि आप DispatcherTimer पर राइट-क्लिक करते हैं और रिज़ॉल्यूशन पर क्लिक करते हैं तो उसे उपयुक्त संदर्भ जोड़ना चाहिए।


WindowsBase.dll btw के संदर्भ को जोड़ने की आवश्यकता है
जॉर्ज बिरबिलिस

16
IMHO इस सवाल का जवाब नहीं देता है कि किस नियंत्रण का उपयोग करना है, यह केवल स्वीकृत उत्तर के लिए कुछ टिप्पणी जोड़ता है।
स्टीफन कैनेडी

3
मैंने 2012 में इसे जोड़ा, बस एक डेवलपर के रूप में शुरू करके, मुझे अभी भी इसके लिए अंक मिलते हैं। लेकिन @StephenKennedy ने बताया कि यह एक टिप्पणी होनी चाहिए।
मालरोक


0

टाइमर में विशेष कार्य हैं।

  1. एक अतुल्यकालिक टाइमर या तुल्यकालिक टाइमर को बुलाओ।
  2. समय अंतराल बदलें
  3. रद्द करने और फिर से शुरू करने की क्षमता  

यदि आप उपयोग करते हैं StartAsync ()या Start (), थ्रेड उपयोगकर्ता इंटरफ़ेस तत्व को ब्लॉक नहीं करता है

     namespace UITimer


     {
        using thread = System.Threading;
        public class Timer
        {

        public event Action<thread::SynchronizationContext> TaskAsyncTick;
        public event Action Tick;
        public event Action AsyncTick;
        public int Interval { get; set; } = 1;
        private bool canceled = false;
        private bool canceling = false;
        public async void Start()
        {
            while(true)
            {

                if (!canceled)
                {
                    if (!canceling)
                    {
                        await Task.Delay(Interval);
                        Tick.Invoke();
                    }
                }
                else
                {
                    canceled = false;
                    break;
                }
            }


        }
        public void Resume()
        {
            canceling = false;
        }
        public void Cancel()
        {
            canceling = true;
        }
        public async void StartAsyncTask(thread::SynchronizationContext 
        context)
        {

                while (true)
                {
                    if (!canceled)
                    {
                    if (!canceling)
                    {
                        await Task.Delay(Interval).ConfigureAwait(false);

                        TaskAsyncTick.Invoke(context);
                    }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }

        }
        public void StartAsync()
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while (true)
                {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);

                    Application.Current.Dispatcher.Invoke(AsyncTick);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }

        public void StartAsync(thread::SynchronizationContext context)
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while(true)
                 {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);
                            context.Post((xfail) => { AsyncTick.Invoke(); }, null);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }
        public void Abort()
        {
            canceled = true;
        }
    }


     }

क्या आप अपना कोड समझा सकते हैं? यदि आप बस कुछ कोड पोस्ट करते हैं, तो लोग इससे नहीं सीखेंगे और बस वेब से कुछ कोड कॉपी और पेस्ट करेंगे।
रॉबर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.