2017-06-14 17 views
5

मैं एक WinForms परियोजना है जो कई साल पुराना है और रेट्रो-फिट async घटना संचालकों के साथ किया गया है है का सामना करना पड़ता:WinForms खिड़की में परिवर्तन आयाम जब यह एक async कॉल

private async void dgvNewOrders_CellClick(object sender, DataGridViewCellEventArgs e) 

इस विधि के अंदर एक async कॉल है:

var projectTemplate = await GetProjectTemplateFile(companyId, sourceLang, targetLang); 

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

वर्तमान में, समस्या डिबग करने के प्रयास में, GetProjectTemplateFile विधि बस की

private async Task<ProjectTemplateFile> GetProjectTemplateFile(long companyId, string sourceLanguage, string targetLanguage) 
{ 
    return null; 
} 

यह कोई अंतर नहीं है कि क्या GetProjectTemplateFile एक async कार्रवाई निष्पादित करता है या नहीं बनाता है होते हैं।

यदि मैं टिप्पणी करता हूं कि एसिंक कॉल GetProjectTemplateFile पर कॉल करता है तो प्रोग्राम आयामों में किसी भी कूद के बिना अपेक्षित चलता है, भले ही CellClick ईवेंट में अन्य एसिंक कॉल किए गए हों।

मैंने .ConfigureAwait(true) को एसिंक कॉल में जोड़ने का प्रयास किया है, जो कोई फर्क नहीं पड़ता। न ही .GetAwaiter().GetResult() के साथ समकालिक रूप से कॉल चला रहा है।

क्या कोई यह समझा सकता है कि इस विशेष एसिंक कॉल के साथ विंडो के आयाम क्यों बदल रहे हैं, और/या इसे रोकने से कैसे रोकें?

अद्यतन
एक अनुरोध के अनुसार, यहाँ एक कोड नमूना जो समझाया व्यवहार elicits है। यहाँ कुछ भी असामान्य नहीं हो रहा है जो मैं देख सकता हूं लेकिन मैं आपको आश्वासन देता हूं, यह कोड समझाया गया व्यवहार कर रहा है।

private async void dgvNewOrders_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    var result = await _templateInteraction.GetProjectTemplateFile(1, 
                    "en-US", 
                    "de-CH"); 
    return; 
} 

public class TemplateInteraction : ITemplateInteraction 
{ 
    public async Task<ProjectTemplateFile> GetProjectTemplateFile(long companyId, string sourceLanguage, string targetLanguage) 
    { 
     return null; 

     // elided code 
    } 

    // other methods 
} 

कुछ अन्य जानकारी जो प्रासंगिक हो सकती हैं:

  • विंडो के FormBorderStyle "FixedToolWindow"
  • खिड़की एक स्टार्टअप विधि
  • AutoSize = झूठी में स्पष्ट चौड़ाई दिया जाता है
  • AutoSizeMode = बढ़ोतरी
  • कंप्यूटर जो उस पर विकसित किया जा रहा है Windows 10 1703 (निर्माता) की अद्यतन जो नई स्केलिंग तर्क
  • है GetprojectTemplateFile विधि async नहीं है, तो अर्थात हस्ताक्षर public ProjectTemplateFile GetProjecttemplateFile(...) तो वहाँ कोई समस्या नहीं है नहीं है। यह समस्या तब मौजूद प्रतीत होती है जब विधि कॉल async है - भले ही मैं इसे अवरुद्ध कर दूं।

अद्यतन 2:
मैं जो इस समस्या का कारण कोड के विशिष्ट लाइन (रों) मिल गया है:

MessageBox.Show(...); 

भीतरी async कॉल, GetProjectTemplateFile हैं, तो API और उसके बाद चेक के कॉल प्रतिक्रिया:

var responseMessage = await client.GetAsync(uri); 
if (!responseMessage.IsSuccessStatusCode) 
{ 
    MessageBox.Show(...); 
    return null; 
} 

अगर मैं टिप्पणी से बाहर MessageBox.Show(...) कॉल तो सब कुछ सामान्य है, कोई स्केलिंग समस्याओं एमएस, आयामों में कोई कूद नहीं।

लेकिन समस्या तब होती है जब MessageBox.Show(...) कॉल जगह में होता है।

इसके अलावा, एपीआई 200 (ठीक) के साथ प्रतिक्रिया करता है ताकि संदेशबॉक्स कोड का भी उपयोग नहीं किया जा रहा हो। मेरा अनुमान है कि जेआईटी कंपाइलर इसे एक संभावना के रूप में देखता है ... यह फ़ॉर्म को दोबारा प्रस्तुत करता है?

इसके अलावा, महत्वपूर्ण रूप से, यह कोड फॉर्म के कोड-बैक में नहीं है, यह एक वर्ग में है जिसे फ़ॉर्म को इसके कन्स्ट्रक्टर में एक उदाहरण दिया गया है।

+2

कृपया एक पूर्ण और न्यूनतम नमूना पोस्ट करें जो आपके द्वारा देखे जा रहे व्यवहार को फिर से बनाएगा। प्रासंगिक कुछ भी शामिल करें, आप किस ढांचे का उपयोग कर रहे हैं, ओएस इत्यादि। यदि 'async' वास्तव में किसी रूप के आकार को यादृच्छिक रूप से बदल रहा है तो यह कम से कम कहने के लिए _interesting_ होगा। – JSteward

+0

अपडेट के लिए धन्यवाद लेकिन मैं जो भी देख रहा हूं उसे पुन: उत्पन्न नहीं कर सकता। यहां मैं जिस कोड का उपयोग कर रहा हूं: [डॉटनेट फीडल] (https://dotnetfiddle.net/6Sn4cj) – JSteward

+0

.NET 4.6 के साथ भी? – awj

उत्तर

3

मुझे लगता है कि आप System.Windows नामस्थान के बजाय प्रेजेंटेशनफ्रेमवर्क.dll से संदर्भित System.Windows नेमस्पेस से संदेशबॉक्स का उपयोग कर रहे हैं?

// Causes DPI scaling problems: 
System.Windows.MessageBox.Show() // loads WPF version from PresentationFramework.dll 

// no DPI scaling issues: 
System.Windows.Forms.MessageBox.Show() // uses standard winforms messagebox 

तो इसके बजाय मानक संदेशबॉक्स का उपयोग करने का प्रयास करें।

मुझे पता चला है कि जब भी कोई भी WPF- लक्षित डीएल स्मृति में लोड हो जाता है, तो डीपीआई ऑटोस्कलिंग रीसेट हो जाता है। विशिष्ट फ़ंक्शन को वास्तव में भी कॉल करने की आवश्यकता नहीं होती है - जैसे ही मूल कार्य को कॉल किया जाता है, डीएलएल लोड हो जाते हैं।

मुझे सिस्टम.Windows.Input.Keyboard.IsKeyToggled(), जो प्रस्तुति Core.dll लोड किया गया था, के द्वारा मुझे एक ही समस्या थी। सोचा था कि मैं पागल भी जा रहा था ...

+0

हाँ, आप सही हैं। क्षमा करें, मैंने इसे कई महीने पहले पाया लेकिन ओपी को कभी अपडेट नहीं किया। – awj

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