2010-12-02 13 views
7

के बराबर विनफॉर्म WinForms ऐप में एक सेटटाइम समकक्ष फ़ंक्शन बनाने के लिए कोई आसान समाधान/विचार/रणनीति है। मैं मुख्य रूप से एक वेब डेवलपर हूं लेकिन मुझे यकीन नहीं है कि मैं WinForms ऐप में इसके बारे में कैसे जाऊंगा। असल में, मेरे पास एक टेक्स्टबॉक्स है, और प्रत्येक कीस्ट्रोक के बाद मैं एक सूची को पॉप्युलेट करने के लिए एक कार्य चलाने के लिए चाहता हूं (जैसे ऑटो-पूर्ण प्रकार की चीज़) लेकिन अगर उपयोगकर्ता अक्षरों में प्रवेश करता रहता है तो रद्द करने में सक्षम होना चाहते हैं (उदाहरण के लिए clearTimeout)जावास्क्रिप्ट सेटटाइमआउट

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

(अगर एक उदाहरण सी # है या Vb.Net मुझे परवाह नहीं है)

+0

[जावास्क्रिप्ट का setTimeout, setInterval और ClearInterval सी # में बराबर] (https://stackoverflow.com/questions/40502596/javascripts-settimeout-setinterval-and-clearinterval-equivalent-in-c-sharp/40609390# 4060 9 3 9 0) – Koray

उत्तर

11

आप एक System.Timers.Timer उपयोग कर सकते हैं: AutoReset गलत पर सेट है और उपयोग प्रारंभ/बंद तरीकों और बीत चुके घटना के लिए कोई हैंडलर पैदा करते हैं।

11
public void setTimeout(Action TheAction, int Timeout) 
    { 
     Thread t = new Thread(
      () => 
      { 
       Thread.Sleep(Timeout); 
       TheAction.Invoke(); 
      } 
     ); 
     t.Start(); 
    } 
+0

एक साफ समाधान – davidsleeps

+2

पोस्ट करने के लिए धन्यवाद मैं इस विधि का उपयोग करने की सिफारिश नहीं करता। सिर्फ एक ही ऑपरेशन के लिए एक संपूर्ण धागा बनाना? Overkill। कुछ और उत्पादन-योग्य के लिए अन्य विधि में प्रदान की गई टाइमर क्लास का उपयोग करें। इस उत्तर के अनुसार, प्रत्येक नए धागे के लिए 1 एमबी मेमोरी आवंटित की जाती है। http://stackoverflow.com/a/2744464/881111 - याद रखें, ओपी ने कहा कि वह प्रत्येक कीस्ट्रोक के बाद इसे चलाने जा रहा था ... तो प्रत्येक कुंजीस्ट्रोक के लिए 1 एमबी मेमोरी और एक नया धागा मानें। बुरा विचार। – Nuzzolilo

+0

न केवल एक बुरा विचार है। इसने शायद समवर्ती मुद्दों –

17

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन कोई वैकल्पिक समाधान Task.Delay(delay).ContinueWith((task) => { /* Code */ }); उपयोग करने के लिए किया जाएगा।

Thread.Sleep vs Task.Delay?

या वहाँ है await Task.Delay(delay);

https://social.msdn.microsoft.com/Forums/vstudio/en-US/345f0402-3af0-4f96-a501-073674883ba3/building-an-async-settimeout-function?forum=csharpgeneral

+0

चीजें तब से एक लंबा सफर तय कर चुके हैं ... उत्तर पोस्ट करने के लिए धन्यवाद! – davidsleeps

0
public void setTimeout(Action act, int timeout) 
    { 
     Action action =() => 
     { 
      Thread.Sleep(Timeout); 
      act(); 
     }; 

     new Thread(() => Invoke(action)).Start(); 
    } 
+0

क्या यह काम करता है? – theonlygusti

0

मैं इस के लिए प्रतिक्रियाशील प्रोग्रामिंग का उपयोग कर सलाह देते हैं। प्रतिक्रियाशील प्रोग्रामिंग के बारे में सामान्य जानकारी के लिए .NET और http://reactivex.io/ के लिए प्रतिक्रियाशील एक्सटेंशन के लिए https://github.com/Reactive-Extensions/Rx.NET देखें।

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

Rx.Observable.fromEvent(..eventdetails..) 
    .debounceTime(300) 
    .distinctUntilChanged() 
    .subscribe(eventHandler); 

इस तरह के सेटअप का उपयोग करके आप चेन ऑपरेटर को स्रोत से किसी ग्राहक से सभी प्रकार की घटनाओं को मैप करने और मर्ज करने के लिए कर सकते हैं। उपरोक्त सरल उदाहरण एक घटना के लिए प्रतिक्रिया करता है, उदाहरण के लिए एक कुंजीअप, और 300 एमएस के लिए कोई नया कीप अप नहीं होने तक प्रतीक्षा करता है और फिर इवेंट हैंडलर को कॉल करता है, लेकिन केवल तभी जब नया मान (300ms के बाद) अंतिम उत्सर्जित मान से अलग होता है।

0

यह मेरा तरीका है, सी # 7.0 वाक्यविन्यास सुविधा का उपयोग करें। कुछ जेएस के साथ भिन्न होते हैं, जब टाइमआउट कार्रवाई निष्पादित होती है तो स्पष्ट नहीं हो सकती है।

internal static class JsStyleTimeout 
{ 
    private static readonly ConcurrentDictionary<int, Thread> InnerDic; 

    private static int _handle; 

    static JsStyleTimeout() 
    { 
     InnerDic = new ConcurrentDictionary<int, Thread>(); 
    } 

    public static int Set(Action action, int delayMs) 
    { 
     var handle = Interlocked.Increment(ref _handle); 

     var thread = new Thread(new ThreadStart(delegate 
     { 
      Thread.Sleep(delayMs); 
      InnerDic.TryRemove(handle, out var _); 
      Task.Factory.StartNew(action); 
     })); 
     InnerDic.TryAdd(handle, thread); 

     thread.Start(); 
     return handle; 
    } 

    public static void Clear(int handle) 
    { 
     if (InnerDic.TryRemove(handle, out var thread)) 
      thread.Abort(); 
    } 
}