दिलचस्प पोस्ट
कर्कश (मिनिमैच / ग्लोब) फ़ोल्डर बहिष्करण पाठ क्षेत्र में jQuery सेट कर्सर स्थिति 'जेड' शब्दशः के साथ सरलीकृत प्रारूप पार्सिंग की तारीख कैसे आईओएस सिस्टम ध्वनि को निष्क्रिय करने के लिए LINQ को इकाईयों को 'डबल पार्स (सिस्टम। स्ट्रिंग)' विधि की पहचान नहीं है, और इस पद्धति को किसी स्टोर अभिव्यक्ति में अनुवाद नहीं किया जा सकता है एक गीट रेपो में फाइल रखें, लेकिन परिवर्तनों को ट्रैक न करें क्या मैं दोस्तों के इस्तेमाल के बिना निजी सदस्यों को कक्षा से बाहर का उपयोग कर सकता हूं? जावा स्विंग: गतिशील तरीके से जीयूआई को कैसे बदला जाए जावा मूल पद्धति स्रोत कोड स्विफ्ट – स्ट्रिंग को दो बार में बदलने का तरीका MySQL के साथ यादृच्छिक पंक्तियों का चयन करना कोणीय में चौकोर ब्रैकेट उपयोग का क्या उद्देश्य है? कैसे PHP में एक सरणी गूंज? क्या कोई एल्गोरिथ्म है जो दो वाक्यांशों की शब्दार्थिक समानता बताता है एंड्रॉइड अलार्म मैनेजर – आरटीसी_वैक्यूप बनाम एलेक्सिडियल टाइमम WAKEUP

मैं एक नया धागा में एक साधारण बिट कोड कैसे चला सकता हूं?

मेरे पास थोड़ा सा कोड है जिसे मुझे जीयूआई की तुलना में एक अलग थ्रेड में चलाने की आवश्यकता है क्योंकि वर्तमान में यह कोड रन रन (10 सेकंड या इतने) के दौरान फॉर्म को फ्रीज करता है।

मान लें कि मैंने पहले एक नया धागा नहीं बनाया है; सी # में यह कैसे करना है और .NET Framework 2.0 या बाद का उपयोग करने का एक सरल / बुनियादी उदाहरण क्या है?

वेब के समाधान से एकत्रित समाधान "मैं एक नया धागा में एक साधारण बिट कोड कैसे चला सकता हूं?"

पढ़ने शुरू करने के लिए अच्छी जगह है जो एल्बहारी

यदि आप अपना खुद का धागा बनाना चाहते हैं, तो यह उतना आसान है जितना कि यह हो:

using System.Threading; new Thread(() => { Thread.CurrentThread.IsBackground = true; /* run your code here */ Console.WriteLine("Hello, world"); }).Start(); 

BackgroundWorker सबसे अच्छा विकल्प है।

यहां मेरा कम से कम उदाहरण है बटन पर क्लिक करने के बाद पृष्ठभूमि कार्यकर्ता पृष्ठभूमि थ्रेड में काम करना शुरू कर देगा और इसके साथ-साथ इसकी प्रगति भी रिपोर्ट करेगा। यह काम पूरा होने के बाद भी रिपोर्ट करेगा।

 using System.ComponentModel; ... private void button1_Click(object sender, EventArgs e) { BackgroundWorker bw = new BackgroundWorker(); // this allows our worker to report progress during work bw.WorkerReportsProgress = true; // what to do in the background thread bw.DoWork += new DoWorkEventHandler( delegate(object o, DoWorkEventArgs args) { BackgroundWorker b = o as BackgroundWorker; // do some simple processing for 10 seconds for (int i = 1; i <= 10; i++) { // report the progress in percent b.ReportProgress(i * 10); Thread.Sleep(1000); } }); // what to do when progress changed (update the progress bar for example) bw.ProgressChanged += new ProgressChangedEventHandler( delegate(object o, ProgressChangedEventArgs args) { label1.Text = string.Format("{0}% Completed", args.ProgressPercentage); }); // what to do when worker completes its task (notify the user) bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler( delegate(object o, RunWorkerCompletedEventArgs args) { label1.Text = "Finished!"; }); bw.RunWorkerAsync(); } 

ध्यान दें:

  • मैंने सी # के सादगी के लिए गुमनाम पद्धति का उपयोग करके एक ही विधि में सब कुछ रखा है लेकिन आप उन्हें अलग-अलग तरीकों से हमेशा खींच सकते हैं
  • ProgressChanged या RunWorkerCompleted हैंडलर के अंतर्गत जीयूआई अपडेट करना सुरक्षित है RunWorkerCompleted हालांकि, DoWork से GUI को अपडेट करने से DoWork InvalidOperationException होगा।

ThreadPool.QueueUserWorkItem कुछ सरल के लिए बहुत आदर्श है एकमात्र चेतावनी अन्य थ्रेड से नियंत्रण तक पहुंच रहा है।

 System.Threading.ThreadPool.QueueUserWorkItem(delegate { DoSomethingThatDoesntInvolveAControl(); }, null); 

त्वरित और गंदे, लेकिन यह काम करेगा:

शीर्ष पर प्रयोग करना:

 using System.Threading; 

सरल कोड:

 static void Main( string[] args ) { Thread t = new Thread( NewThread ); t.Start(); } static void NewThread() { //code goes here } 

मैंने इसे exmaple के लिए एक नया कंसोल ऐप्लिकेशन में फेंक दिया

यहां एक और विकल्प है:

 Task.Run(()=>{ //Here is a new thread }); 

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

यदि आप एक मान प्राप्त करना चाहते हैं:

 var someValue; Thread thread = new Thread(delegate() { //Do somthing and set your value someValue = "Hello World"; }); thread.Start(); while (thread.IsAlive) Application.DoEvents(); 

उस कोड को किसी फ़ंक्शन (उस कोड को GUI के रूप में एक ही धागे पर निष्पादित नहीं किया जा सकता) में रखें, और उस कोड के निष्पादन को ट्रिगर करने के लिए निम्न डाल दें।

Thread myThread= new Thread(nameOfFunction);

workerThread.Start();

थ्रेड ऑब्जेक्ट पर प्रारंभ फ़ंक्शन कॉल करने से आपके फ़ंक्शन कॉल का निष्पादन एक नए थ्रेड में होगा।

 // following declaration of delegate ,,, public delegate long GetEnergyUsageDelegate(DateTime lastRunTime, DateTime procDateTime); // following inside of some client method GetEnergyUsageDelegate nrgDel = GetEnergyUsage; IAsyncResult aR = nrgDel.BeginInvoke(lastRunTime, procDT, null, null); while (!aR.IsCompleted) Thread.Sleep(500); int usageCnt = nrgDel.EndInvoke(aR); 

चार्ल्स आपका कोड (ऊपर) सही नहीं है। आपको पूरा होने की प्रतीक्षा करने की आवश्यकता नहीं है। एंड इन्वॉक तब तक ब्लॉक करेगा जब तक प्रतीक्षाहैंडल सिग्नल न हो।

यदि आप पूरा होने तक ब्लॉक करना चाहते हैं तो आपको बस की आवश्यकता है

 nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null)); 

या वैकल्पिक रूप से

 ar.AsyncWaitHandle.WaitOne(); 

लेकिन अगर आप ब्लॉक करते हैं तो एसीसी कॉल जारी करने का क्या मतलब है? आप एक तुल्यकालिक कॉल का उपयोग कर सकते हैं। सफाई के लिए लैम्ब्डा में एक बेहतर शर्त को ब्लॉक और पास नहीं करना होगा:

 nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null); 

ध्यान रखना एक बात यह है कि आपको एंड इन्वोक को फोन करना चाहिए । बहुत सारे लोग यह भूल जाते हैं और प्रतीक्षाहाण्डल को लीक करते हैं क्योंकि अधिकांश एसिंक कार्यान्वयन एंड इन्वोक में वेटथैण्डल जारी करता है।

यदि आप कच्चे थ्रेड ऑब्जेक्ट का उपयोग करने जा रहे हैं, तो आपको इज़बैकगोल को कम से कम सेट करना होगा और आपको थ्रेडिंग अपार्टमेंट मॉडल (शायद एसटीए) भी सेट करना चाहिए।

  public static void DoWork() { // do some work } public static void StartWorker() { Thread worker = new Thread(DoWork); worker.IsBackground = true; worker.SetApartmentState(System.Threading.ApartmentState.STA); worker.Start() } 

यदि आप UI इंटरैक्शन की आवश्यकता है तो मैं पृष्ठभूमिवर्कर वर्ग की सिफारिश करेगा।

यहाँ कैसे प्रगति के साथ धागे का उपयोग कर सकते हैं, यह सिर्फ कैसे सूत्र काम करता है को समझने के लिए, रूप में वहाँ तीन प्रगति है और 4 बटन:

  public partial class Form1 : Form { public Form1() { InitializeComponent(); } Thread t, t2, t3; private void Form1_Load(object sender, EventArgs e) { CheckForIllegalCrossThreadCalls = false; t = new Thread(birinicBar); //evry thread workes with a new progressBar t2 = new Thread(ikinciBar); t3 = new Thread(ucuncuBar); } public void birinicBar() //to make progressBar work { for (int i = 0; i < 100; i++) { progressBar1.Value++; Thread.Sleep(100); // this progressBar gonna work faster } } public void ikinciBar() { for (int i = 0; i < 100; i++) { progressBar2.Value++; Thread.Sleep(200); } } public void ucuncuBar() { for (int i = 0; i < 100; i++) { progressBar3.Value++; Thread.Sleep(300); } } private void button1_Click(object sender, EventArgs e) //that button to start the threads { t.Start(); t2.Start(); t3.Start(); } private void button4_Click(object sender, EventArgs e)//that button to stup the threads with the progressBar { t.Suspend(); t2.Suspend(); t3.Suspend(); } private void button2_Click(object sender, EventArgs e)// that is for contuniue after stuping { t.Resume(); t2.Resume(); t3.Resume(); } private void button3_Click(object sender, EventArgs e) // finally with that button you can remove all of the threads { t.Abort(); t2.Abort(); t3.Abort(); } } 

दूसरा विकल्प, जो प्रतिनिधि और थ्रेड पूल का उपयोग करता है …

'GetEnergyUsage' मानते हुए एक विधि है, जो एक समयसीमा और अन्य दिनांक समय इनपुट आर्गुमेंट के रूप में लेती है, और एक इंटर … देता है।

 // following declaration of delegate ,,, public delegate long GetEnergyUsageDelegate(DateTime lastRunTime, DateTime procDateTime); // following inside of some client method GetEnergyUsageDelegate nrgDel = GetEnergyUsage; IAsyncResult aR = nrgDel.BeginInvoke(lastRunTime, procDT, null, null); while (!aR.IsCompleted) Thread.Sleep(500); int usageCnt = nrgDel.EndInvoke(aR); 

कैसे करें: फ़ाइलों के लिए खोज करने के लिए पृष्ठभूमि थ्रेड का उपयोग करें

आपको अन्य धागे से जीयूआई विशिष्ट सामान तक पहुंच के साथ बहुत सावधान रहना होगा (यह कई जीयूआई टूलकिट्स के लिए सामान्य है) यदि आप प्रसंस्करण धागा से GUI में कुछ अपडेट करना चाहते हैं तो यह जवाब देखें जो मुझे लगता है कि WinForms के लिए उपयोगी है I WPF के लिए यह देखें (यह दिखाता है कि कैसे घटक को अपडेटप्रग्रेशन () में छू सकता है, तो यह अन्य थ्रेड्स से काम करेगा, लेकिन वास्तव में मुझे यह पसंद नहीं है कि यह CheckAccess() को Dispathcer के माध्यम से BeginInvoke से पहले नहीं कर रहा है, देखें और CheckAccess में खोजें यह)

थ्रेडिंग पर एनईटी विशिष्ट पुस्तक दिख रही थी और यह एक (मुफ्त डाउनलोड) पाया। इसके बारे में अधिक जानकारी के लिए http://www.albahari.com/threading/ देखें।

मेरा मानना ​​है कि आप पाएंगे कि आपको पहले 20 पृष्ठों में नया थ्रेड के रूप में निष्पादन लॉन्च करने की आवश्यकता है और इसके पास बहुत अधिक है (जीयूआई विशिष्ट स्निपेट्स के बारे में निश्चित नहीं हैं जिसका मतलब है कि मैं थ्रेडिंग के लिए कड़ाई से विशिष्ट है)। यह सुनकर खुशी होगी कि समुदाय इस काम के बारे में क्या सोचता है, क्योंकि मैं इसे पढ़ रहा हूं। अभी के लिए मेरे लिए बहुत साफ दिखता है (सूत्र के लिए नेट विशिष्ट विधियों और प्रकार दिखाने के लिए)। इसके अलावा यह नेट 2.0 (और 1.1 प्राचीन नहीं) को कवर करता है जो मैं वास्तव में सराहना करता हूं।

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

कोड परियोजना वेब साइट पर एक अच्छा async विधि लेख है जो विभिन्न तरीकों का वर्णन करता है और नमूना कोड प्रदान करता है।

मैं जेफ रिक्टर की पावर थ्रेडिंग लाइब्रेरी और विशेष रूप से IAsyncEnumerator को देखना चाहूंगा चार्ली कैल्वर्ट के ब्लॉग पर वीडियो को देखें, जहां रिचटर अच्छा अवलोकन के लिए उस पर जाता है

नाम से बंद न करें क्योंकि यह एसिंक्रोनस प्रोग्रामिंग कार्य को कोड में आसान बनाता है।