मैं एक 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 (ठीक) के साथ प्रतिक्रिया करता है ताकि संदेशबॉक्स कोड का भी उपयोग नहीं किया जा रहा हो। मेरा अनुमान है कि जेआईटी कंपाइलर इसे एक संभावना के रूप में देखता है ... यह फ़ॉर्म को दोबारा प्रस्तुत करता है?
इसके अलावा, महत्वपूर्ण रूप से, यह कोड फॉर्म के कोड-बैक में नहीं है, यह एक वर्ग में है जिसे फ़ॉर्म को इसके कन्स्ट्रक्टर में एक उदाहरण दिया गया है।
कृपया एक पूर्ण और न्यूनतम नमूना पोस्ट करें जो आपके द्वारा देखे जा रहे व्यवहार को फिर से बनाएगा। प्रासंगिक कुछ भी शामिल करें, आप किस ढांचे का उपयोग कर रहे हैं, ओएस इत्यादि। यदि 'async' वास्तव में किसी रूप के आकार को यादृच्छिक रूप से बदल रहा है तो यह कम से कम कहने के लिए _interesting_ होगा। – JSteward
अपडेट के लिए धन्यवाद लेकिन मैं जो भी देख रहा हूं उसे पुन: उत्पन्न नहीं कर सकता। यहां मैं जिस कोड का उपयोग कर रहा हूं: [डॉटनेट फीडल] (https://dotnetfiddle.net/6Sn4cj) – JSteward
.NET 4.6 के साथ भी? – awj