मैं VB.NET 14 में निम्नलिखित WPF नमूना एप्लिकेशन लिखा VS2015.1 पर नेट 4.6.1 का उपयोग कर:IDisposable.Dispose() async विधि के लिए रिलीज मोड में नहीं बुलाया
Class MainWindow
Public Sub New()
InitializeComponent()
End Sub
Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs)
MessageBox.Show("Pre")
Using window = New DisposableWindow()
window.Show()
For index = 1 To 1
Await Task.Delay(100)
Next
End Using
MessageBox.Show("Post")
End Sub
Class DisposableWindow
Inherits Window
Implements IDisposable
Public Sub Dispose() Implements IDisposable.Dispose
Me.Close()
MessageBox.Show("Disposed")
End Sub
End Class
End Class
नमूना नीचे का उत्पादन निम्नलिखित उत्पादन:
- डीबग मोड: पूर्व, निपटाई गई, पोस्ट
- रिलीज मोड: पूर्व, डाक
यह वह जगह है अजीब। डीबग मोड इस कोड को रिलीज मोड से अलग तरीके से निष्पादित क्यों करेगा ...?
जब मैं एक मैनुअल कोशिश करने के लिए ब्लॉक का उपयोग बदलने के/अंत में ब्लॉक, window.Dispose (करने के लिए कॉल) भी एक NullReferenceException फेंकता है:
Dim window = New DisposableWindow()
Try
window.Show()
For index = 1 To 1
Await Task.Delay(100)
Next
Finally
window.Dispose()
End Try
और भी अधिक अजीब सामान: जब के लिए लूप है बाहर रखा गया, नमूना पूरी तरह से काम करता है। मैंने केवल फोर्स-लूप को एक बार चलाने दिया है, ताकि कम से कम लूप को समस्या उत्पन्न हो सके। थोड़ी देर के लिए फॉर-लूप को प्रतिस्थापित करने के लिए भी स्वतंत्र महसूस करें। यह फोर-लूप के समान व्यवहार करता है।
काम करता है:
Using window = New DisposableWindow()
window.Show()
Await Task.Delay(100)
End Using
अब आप सोच सकते हैं: 'यह अजीब है!'। यह और भी बदतर हो जाता है। मैंने सी # (6) में भी वही उदाहरण बनाया है, जहां यह पूरी तरह से काम करता है। तो सी # में डीबग और रिलीज मोड दोनों के परिणामस्वरूप 'प्री, डिस्प्लेड, पोस्ट' आउटपुट के रूप में होता है।
नमूने यहाँ डाउनलोड किया जा सकता है:
http://www.filedropper.com/vbsample
http://www.filedropper.com/cssample
मैं बहुत इस बिंदु पर स्टम्प्ड रहा हूँ। क्या यह .NET Framework के VB.NET स्टैक में एक बग है? या क्या मैं कुछ अजीब काम करने की कोशिश कर रहा हूं, जो भाग्य से सी # में काम करता है और आंशिक रूप से वीबी.नेट में?
संपादित करें:
कुछ और परीक्षण किया:
- रिलीज मोड के लिए VB.NET में संकलक अनुकूलन अक्षम करना, यह डीबग मोड की तरह व्यवहार की उम्मीद के रूप में बनाता है (, लेकिन यह परीक्षण करने के लिए चाहता था, शायद ज़रुरत पड़े)।
- समस्या तब भी होती है जब मैं .NET 4.5 को लक्षित करता हूं (सबसे पुराना संस्करण जहां async/await उपलब्ध हो गया था)।
अद्यतन:
इस के बाद से निर्धारित किया गया है। संस्करण 1.2 के लिए सार्वजनिक रिलीज की योजना बनाई गई है, लेकिन मास्टर शाखा में नवीनतम संस्करण में फिक्स होना चाहिए।
देखें: https://github.com/dotnet/roslyn/issues/7669
सिर्फ एक कूबड़ है, लेकिन ऐसा लगता है कि निपटान() कॉल एक अलग धागे पर है। डीबग में काम करने का कारण यह है कि डीबगर आपके लिए थ्रेड स्विच कर रहा है। यदि आपने कुछ प्रकार के कॉलबैक जोड़े हैं जो आपको सही धागे पर वापस ले जाते हैं तो आपको बेहतर भाग्य मिल सकता है। – sapbucket
उदाहरण के लिए, कैसे कोड का उपयोग करता आह्वान आवश्यक देखें: http://stackoverflow.com/questions/3874134/cleaning-up-code-littered-with-invokerequired – sapbucket
@sapbucket: उचित लगता है, लेकिन यही कारण है कि यह स्पष्ट नहीं होता सी # में काम करता है। दोनों भाषाओं को एक ही एमएसआईएल के बारे में संकलित करना चाहिए, है ना? रुको, यह मुझे एक विचार देता है: मुझे एमएसआईएल की तुलना करनी चाहिए। मैं बाद में कोशिश करूंगा! –