5

का इंतजार के सांत्वना आवेदन इस्तेमाल कर रही है के संदर्भ में async/ निर्माणों का इंतजार है, मुझे पता है कि अगर यह संभव है "निरंतरता" पर एक से अधिक थ्रेड पर समानांतर में चलाने के लिए चाहते हैं विभिन्न सीपीयू।टास्क निरंतरता async के साथ समानांतर निष्पादन/

मुझे लगता है कि यह मामला है, क्योंकि डिफ़ॉल्ट कार्य शेड्यूलर (कंसोल ऐप में सिंक्रनाइज़ेशन कॉन्टेक्स्ट नहीं) पर जारीियां पोस्ट की जाती हैं, जो थ्रेड पूल है।

मुझे पता है कि async/प्रतीक्षा निर्माण कोई अतिरिक्त धागा नहीं बनाते हैं। फिर भी थ्रेड पूल द्वारा प्रति सीपीयू का निर्माण कम से कम एक धागा होना चाहिए, और इसलिए यदि थ्रेड पूल पर निरंतरता पोस्ट की जाती है, तो यह अलग-अलग CPUs पर पैरारलल में कार्य निरंतरता निर्धारित कर सकती है ... मैंने यही सोचा, लेकिन किसी कारण से मैं कल इसके बारे में वास्तव में भ्रमित हो गया और अब मुझे इतना यकीन नहीं है।

public class AsyncTest 
{ 
    int i; 

    public async Task DoOpAsync() 
    { 
    await SomeOperationAsync(); 

    // Does the following code continuation can run 
    // in parrallel ? 
    i++;  

    // some other continuation code .... 
    } 

    public void Start() 
    { 
    for (int i=0; i<1000; i++) 
    { var _ = DoOpAsync(); } // dummy variable to bypass warning 
    } 
} 

SomeOperationAsync अपने आप में किसी भी सूत्र नहीं बनाया है, और के उदाहरण के लिए कहते हैं कि यह सिर्फ एसिंक्रोनस रूप से I/O पूर्णता पर निर्भर कुछ अनुरोध भेजता है कि चलो करता है:

यहाँ कुछ सरल कोड है बंदरगाह तो किसी भी धागे को अवरुद्ध नहीं कर रहा है।

अब, अगर मैं फोन प्रारंभ विधि जो 1000 async संचालन जारी करेगा, यह async विधि की निरंतरता कोड के लिए संभव है (इंतजार के बाद) अलग सीपीयू धागे पर समानांतर में चलाने के लिए? यानी मुझे इस मामले में थ्रेड सिंक्रनाइज़ेशन की देखभाल करने की आवश्यकता है और "i" फ़ील्ड तक पहुंच सिंक्रनाइज़ करना है?

+0

क्या आप चाहते हैं कि वे समानांतर में चलें, या नहीं? यदि आप करते हैं, तो सभी कॉल को सिंक्रनाइज़ करना काफी आसान है, बस 'स्टार्ट' में' DoOpAsync 'का इंतजार करें। – Servy

उत्तर

4

हां, आपको i++ के आसपास थ्रेड सिंक्रनाइज़ेशन लॉजिक रखना चाहिए क्योंकि यह संभव है कि एकाधिक थ्रेड एक ही समय में await के बाद कोड निष्पादित कर रहे हों।

लूप के परिणामस्वरूप, कार्य की संख्या बनाई जाएगी। ये कार्य विभिन्न थ्रेड पूल धागे पर निष्पादित किए जाएंगे। एक बार ये कार्य निरंतरता पूर्ण हो जाते हैं यानी प्रतीक्षा के बाद कोड, अलग थ्रेड पूल धागे पर फिर से निष्पादित किया जाएगा। इससे यह संभव हो जाता है कि एक ही समय में कई धागे i ++ कर रहे हों I12+

+0

आपके उत्तर Haris के लिए धन्यवाद! स्पष्टीकरण के लिए – darkey

2

आपकी समझ सही है: कंसोल अनुप्रयोगों में, डिफ़ॉल्ट निरंतरता से डिफ़ॉल्ट SynchronizationContext के कारण थ्रेड पूल पर निर्धारित किया जाएगा।

प्रत्येक async विधि तुल्यकालिक शुरू करता है, तो आपके for पाश एक ही धागे पर DoOpAsync की शुरुआत पर अमल होगा। मान लें कि SomeOperationAsync एक अपूर्ण Task देता है, निरंतरता थ्रेड पूल पर निर्धारित की जाएगी।

तो DoOpAsync के प्रत्येक आमंत्रण समानांतर में जारी रह सकते हैं।

+0

धन्यवाद स्टीफन :) – darkey

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