2017-03-06 13 views
5

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

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

संपादित करें: असल में मैं gmap.net का उपयोग करके Google मानचित्र पर मार्कर लगाने की योजना बना रहा हूं। मैंने दो मार्करों के लिए दो थ्रेड फ़ंक्शंस बनाए हैं। वह दो अलग-अलग फ़ाइलों से आवश्यक डेटा लाएगा। इसे लम्बे समय तक और साजिश में परिवर्तित करना मानचित्र पर। इस दृष्टिकोण के साथ मैं दोनों समान कार्यक्षमता के लिए डुप्लिकेट फ़ंक्शंस बना रहा हूं। लेकिन मुझे लगता है कि यह प्रोग्रामिंग का एक अच्छा तरीका नहीं है, इसलिए फाइल को कनवर्ट करने के लिए डेटा को साजिश करने और लाने के लिए एक सामान्य फ़ंक्शन का उपयोग करना चाहते हैं।

इसलिए जब एक धागा सामान्य फ़ंक्शन तक पहुंच रहा है तो किसी को भी प्रतीक्षा करनी चाहिए। पहले फ़ंक्शन को रिलीज़ करने के लिए फ़ंक्शन या उसकी समयावधि समाप्त हो जाती है, इसे संदर्भ स्विच करना चाहिए और दूसरे थ्रेड को सामान्य फ़ंक्शन तक पहुंचना चाहिए। यही वह है जिसे मैं हासिल करने की कोशिश कर रहा हूं। अगर मुझे अपना दृष्टिकोण संशोधित करना चाहिए तो कृपया मुझे बताएं। enter image description here

+1

कृपया तुम क्या मतलब है, हो सकता है यह छद्म कोड में लिखते हैं, या एक प्रवाह आरेख कि यह कैसे किया जाना चाहिए दे विस्तार से थोड़ा अधिक का प्रदर्शन, लेख के इस खंड का कारण मदद नहीं करता है मुझे उदाहरण के लिए कि – Icepickle

+1

अपने प्रश्न को दोबारा लिखें ताकि पढ़ने के लिए आसान हो, आपने जो कुछ भी कोशिश की है, उसे भी कुछ कोड जोड़ें। –

+0

@Icepickle कृपया अपडेट किया गया प्रश्न ढूंढें .. –

उत्तर

8

एक ताला के साथ 2 कार्यों की तरह लगता है कि आप क्या चाहते करना चाहिए:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var task1 = Task.Run(() => Func1()); 
     var task2 = Task.Run(() => Func2()); 

     Task.WaitAll(task1, task2); 
    } 

    static object lockObj = new object(); 

    static void Func1() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      Func3("Func1"); 
      Thread.Sleep(1); 
     } 
    } 

    static void Func2() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      Func3("Func2"); 
      Thread.Sleep(1); 
     } 
    } 

    static void Func3(string fromFn) 
    { 
     lock(lockObj) 
     { 
      Console.WriteLine("Called from " + fromFn); 
     } 
    } 
} 

ताला एक ही बार में एक से अधिक थ्रेड में चलने से संलग्न कोड से बचाता है। (Sleep बयान प्रदर्शन उद्देश्यों के लिए कार्यों को धीमा करने के लिए पूरी तरह से हैं - उनके पास आपके अंतिम कोड में कोई स्थान नहीं होगा)।

आउटपुट है:

Called from Func2 
Called from Func1 
Called from Func2 
Called from Func1 
Called from Func2 
Called from Func1 
Called from Func1 
Called from Func2 
Called from Func1 
Called from Func2 
+0

को यह आवश्यक नहीं है ओपी क्या चाहता है करो। इस बात की कोई गारंटी नहीं है कि दोनों कार्य समान रूप से वैकल्पिक होंगे। – InBetween

+1

@InBetween: हम्म ... मैंने उन आवश्यकताओं में कुछ भी नहीं देखा जो 'यहां तक ​​कि' निर्दिष्ट हैं। लेकिन सवाल उस क्षेत्र में क्रिस्टल स्पष्ट नहीं है। :) – Baldrick

+0

यह नहीं है, लेकिन * "मैं दूसरे के बाद दो कार्यों को चलाने के लिए चाहता हूं ..." * मुझे आश्चर्य है, इसलिए टिप्पणी यह ​​स्पष्ट करती है कि आपका समाधान इसे लागू नहीं करता है। इसके अलावा, यह एक अच्छा जवाब है। – InBetween

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