2012-10-05 16 views
5

जैसा कि मैंने हाल ही में अपनी लागत के लिए खोज की है, await कर रहा है जब कोई सिंक्रनाइज़ेशन संदर्भ नहीं होता है, जिसके परिणामस्वरूप कोड को अलग-अलग धागे पर निष्पादित किया जा सकता है।उसी धागे पर निष्पादित करने के इंतजार के बाद मुझे निरंतरता कैसे मिल सकती है?

मुझे वर्तमान में एक वीएसटीओ कार्यालय ऐड-इन में अजीब व्यवहार के साथ समस्याएं आ रही हैं, जो मुझे लगता है कि संभवतः इस व्यवहार का परिणाम है। Office अनुप्रयोग द्वारा उठाए गए ईवेंट को संसाधित करते समय, स्थान पर कोई सिंक्रनाइज़ेशन संदर्भ नहीं होता है (जब तक कि मैं कोई फॉर्म नहीं बनाता, जो सिंक्रनाइज़ेशन संदर्भ बनाएगा)।

मेरा सवाल यह है कि क्या एक फॉर्म बनाना यह सुनिश्चित करने का सबसे अच्छा/सबसे प्रभावी तरीका है कि मेरे पास सिंक्रनाइज़ेशन संदर्भ है, या यह करने का एक आसान तरीका है या नहीं।

+0

क्या इस मामले में 'प्रतीक्षा' का उपयोग नहीं करना आसान होगा? यदि आप जिस एपीआई का उपयोग कर रहे हैं वह केवल असीमित है, तो आप 'कार्य' के 'परिणाम' या 'प्रतीक्षा() 'का उपयोग करके प्राप्त कर सकते हैं। – svick

+0

@svick: मुझे लगता है कि आप क्या कह रहे हैं कि अगर मैं एक ही थ्रेड पर वापस आने का इंतजार करना चाहता हूं, तो यह प्रभावी रूप से "तुल्यकालिक" व्यवहार है। हमम ... हाँ, मुझे लगता है कि यह है। * साई *। मैं ईमानदार होने के लिए, इस सामान के साथ थोड़ा सा खो गया हूँ। –

उत्तर

5

कार्यालय ऐप्स एसटीए संदर्भ में अपनी घटनाओं का आह्वान करते हैं, लेकिन वे उपयुक्त SynchronizationContext प्रदान नहीं करते हैं।

इस ब्लॉग के आसपास काम करने का सबसे आसान तरीका SynchronizationContext Odds and Ends में मेरे ब्लॉग पर समझाया गया है, जहां मैंने अपने आलेख के लिए शोध करते समय पाया कि कुछ विविध चीजों का संक्षेप में वर्णन किया गया है, लेकिन इसमें शामिल करने के लिए पर्याप्त महत्वपूर्ण नहीं था। हर घटना की शुरुआत में इस समस्या को ठीक करने के लिए, ऐसा करते हैं:

SynchronizationContext.SetSynchronizationContext(
    new WindowsFormsSynchronizationContext()); 

किसी भी await उसके बाद रों एसटीए धागे पर फिर से शुरू करना चाहिए।

+0

ऐसा करने के बारे में सोचने वाले किसी को भी ध्यान दें - यह भी देखें http://stackoverflow.com/q/12898569/98422 –

3

आप this article को देखना चाहते हैं, जो वर्णन करता है कि एक संदेश पंप के बिना सिंक्रनाइज़ेशन कॉन्टेक्स्ट को कैसे सेट अप करें। ध्यान दें कि यह वास्तव में केवल उपयोगी है यदि आप अन्य काम करने की उम्मीद करते हैं जिसका आप इंतजार करना चाहते हैं (एकाधिक कॉलबैक कतारबद्ध करना।) यदि आप कभी भी एक समय में एक चीज़ का इंतजार कर रहे हैं, तो आपका कोड भी सिंक्रनाइज़ हो सकता है, क्योंकि आप ' आपके निष्क्रिय समय के साथ कुछ और करने के लिए नहीं है, जैसे संदेश पंप चलाएं।