2012-03-03 30 views
5

का परिणाम प्राप्त करें मेरे पास ऐसी विधि है जो वेब सेवा के लिए असीमित कॉल करता है। ऐसा ही कुछ:async विधि

public static async Task<ReturnResultClass> GetBasicResponseAsync() 
{ 
    var r = await SomeClass.StartAsyncOp(); 
    return await OtherClass.ProcessAsync(r); 
} 

और मैं तुल्यकालिक विकल्प उपलब्ध कराना चाहते हैं: Result फोन पर

public static ReturnResultClass GetBasicResponse() 
{ 
    return GetBasicResponseAsync().Result; 
} 

लेकिन यह ब्लॉक। क्योंकि इसे एक ही थ्रेड पर एसिंक ऑपरेशंस के रूप में बुलाया जाता है। मैं सिंक्रनाइज़ परिणाम कैसे प्राप्त कर सकता हूं?

धन्यवाद!

उत्तर

8

आप सही हैं, यदि आप एक जीयूआई आवेदन में हैं, तो async विधि का निरंतरता भाग डिफ़ॉल्ट रूप से यूआई थ्रेड पर निष्पादित होगा। और यदि आप एक ही समय में यूआई थ्रेड पर एक ही कार्य के लिए सिंक्रोनस प्रतीक्षा निष्पादित करते हैं, तो आपको एक डेडलॉक मिलेगा।

यदि यह आपका आवेदन है, तो आप आसानी से कार्य को सिंक्रनाइज़ करने की प्रतीक्षा नहीं कर सकते हैं।

यदि आप सिर्फ लाइब्रेरी लिख रहे हैं, तो आप ConfigureAwait(false) का उपयोग कर इसे ठीक कर सकते हैं। इस तरह, विधि का निरंतर भाग कैप्चर किए गए संदर्भ (जीयूआई अनुप्रयोगों में यूआई थ्रेड) पर निष्पादित नहीं होगा, बल्कि इसके बजाय थ्रेडपूल थ्रेड पर निष्पादित होगा।

public static async Task<ReturnResultClass> GetBasicResponseAsync() 
{ 
    var r = await SomeClass.StartAsyncOp().ConfigureAwait(false); 
    return await OtherClass.ProcessAsync(r).ConfigureAwait(false); 
} 
बेशक

, आदर्श समाधान अपने जीयूआई क्षुधा और उपयोग अपने पुस्तकालय में ConfigureAwait() में तुल्यकालिक संचालन का उपयोग नहीं करने के लिए, ताकि अन्य लोग, तरीकों में से तुल्यकालिक संस्करणों का उपयोग कर सकते हैं अगर वे चाहते हैं।

+0

धन्यवाद! 'ConfigureAwait' मेरी lib के async क्लाइंट को प्रभावित करेगा? मेरा मतलब है, एसिंक ऑपरेशन एसिंक रहेंगे, या वे सभी ग्राहकों के लिए अन्य धागे पर निष्पादित किए जाएंगे? – gor

+0

हां, यह एसिंक ग्राहकों को भी प्रभावित करेगा, लेकिन एक तरह से यह ठीक होना चाहिए। Async ऑपरेशंस async रहेगा, यह केवल इतना है कि 'ConfigureAwait() 'का उपयोग करने वाले कोड का निरंतर भाग UI थ्रेड पर निष्पादित नहीं होगा। लेकिन यूआई थ्रेड पर शुरू होने वाली विधियों में से कोई भी एसिंक कोड वहां रहेगा (जब तक आप वहां 'कॉन्फ़िगरएवाइट()' का उपयोग नहीं करते)। – svick

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