2012-06-25 25 views
8

आवेदन का मुख्य धागा कुछ काम कर रहा है।सी # async कॉल विधि समय-समय पर

एक टाइमर भी मौजूद है, जिसमें हर 10 मिनट में कुछ विधि को कॉल करना चाहिए जो असीमित चलाना चाहिए।

क्या आप कृपया मुझे एक अच्छा उदाहरण दे सकते हैं कि इसे व्यवस्थित कैसे किया जाए?

+2

दोहराएं क्या यह एएसपी.नेट, रूप है, अन्य? –

+1

क्या यह एक जीयूआई ऐप है? – Tudor

+0

यह एक विंडोज़ सेवा है जो वास्तव में एक सर्वर है और हमेशा नए कनेक्शन सुनती है। तो जीयूआई नहीं है, लेकिन सर्वर के काम को रोका नहीं जाना चाहिए – Ksice

उत्तर

12

मैं लूप और नींद के साथ एक स्पष्ट धागे का उपयोग करने की अनुशंसा नहीं करता। यह बुरा अभ्यास और बदसूरत है। इस उद्देश्य के लिए टाइमर कक्षाएं हैं:

यदि यह एक जीयूआई ऐप नहीं है, तो आप समय-समय पर एक अलग थ्रेड पर कोड निष्पादित करने के लिए System.Threading.Timer का उपयोग कर सकते हैं।

यदि यह WinForms/WPF ऐप क्रमशः System.Windows.Forms.Timer और System.Windows.Threading.DispatcherTimer पर एक नज़र डालें। ये आसान हैं क्योंकि वे GUI थ्रेड पर अपना कोड निष्पादित करते हैं, इस प्रकार स्पष्ट Invoke कॉल की आवश्यकता नहीं होती है।

लिंक में प्रत्येक के लिए उदाहरण भी शामिल हैं।

+0

बस एक जिज्ञासा, यदि ये टाइमर जीयूआई थ्रेड पर निष्पादित करते हैं तो वे मुख्य अनुप्रयोग को अवरुद्ध करेंगे, निश्चित रूप से एक अलग धागा एसिंक्रोनस आवश्यकता के लिए बेहतर है? मैं इस बात से सहमत हूं कि निष्पादन के लिए पूरे धागे को जीवित रखना हर 10 मिनट आदर्श नहीं है। – Vok

+0

@ वोक: यह निर्भर करता है कि आपको क्या करना है। ये टाइमर जीयूआई के त्वरित आवधिक अद्यतन के लिए अच्छे हैं। यदि कोड अधिक लंबा चल रहा है, तो आपको केवल अद्यतन भाग के लिए 'System.Threading.Timer' का उपयोग' स्पष्ट 'आमंत्रण के साथ करना चाहिए। वैसे भी, विभिन्न स्थितियों के लिए उपलब्ध टूल्स को जानना अच्छा होता है। – Tudor

1

सबसे आसान तरीका एक कॉल करने के लिए सबसे आसान तरीका है जो कार्यों के बीच 10 मिनट तक सोता है। यह कुछ भी अवरुद्ध नहीं करता है क्योंकि यह किसी अन्य धागे में है।

.NET 4 में, आप Task वर्ग के साथ ऐसा होगा:

Task t = Task.Factory.StartNew(() => { /* your code here */ }); 
// or 
Task t = Task.Factory.StartNew(YourFunctionHere); 

void YourFunction() { 
    while (someCondition) { 
     // do something 
     Thread.Sleep(TimeSpan.FromMinutes(10)); 
    } 
} 

(इस कोड को परीक्षण नहीं किया गया)

0

एक BackgroundWorker धागा प्रयोग करें।

void FireTask() 
{ 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //Your job 
} 
-2

एक और धागा है कि एक पाश

पाश अंदर चलाता शुरू करें, 10 मिनट के लिए सो जाओ, फिर अपनी विधि को कॉल करें,

संबंधित मुद्दे