এনভায়রনমেন্ট.এক্সিট () প্রোগ্রামটি আর বন্ধ করে দেয় না কেন?


134

এটি এমন কিছু জিনিস যা আমি কয়েকদিন আগে আবিষ্কার করেছি, আমি নিশ্চিত হয়েছি যে এটি কেবল এই প্রশ্ন থেকে আমার মেশিনে সীমাবদ্ধ নয় ।

এটিকে তিরস্কার করার সহজতম উপায় হ'ল উইন্ডোজ ফর্ম অ্যাপ্লিকেশন শুরু করা, একটি বোতাম যুক্ত করুন এবং এই কোডটি লিখুন:

    private void button1_Click(object sender, EventArgs e) {
        MessageBox.Show("yada");
        Environment.Exit(1);         // Kaboom!
    }

প্রস্থান () স্টেটমেন্ট কার্যকর হওয়ার পরে প্রোগ্রাম ব্যর্থ হয় । উইন্ডোজ ফর্মগুলিতে আপনি "উইন্ডো হ্যান্ডেল তৈরি করতে ত্রুটি" পান।

পরিচালনা না করা ডিবাগিং সক্ষম করা কী হচ্ছে তা কিছুটা পরিষ্কার করে দেয়। এর COM মোডাল লুপ নির্বাহ এবং WM_PAINT বার্তা বিতরিত হতে দেয় হয়। এটি নিষ্পত্তি ফর্মের জন্য মারাত্মক।

আমি এখন পর্যন্ত একমাত্র সত্যগুলি সংগ্রহ করেছি:

  • এটি কেবলমাত্র ডিবাগারের সাথে চলমান সীমাবদ্ধ নয়। এটি একটি ছাড়াও ব্যর্থ হয়। বরং খারাপভাবেই, ডাব্লুইইআর ক্র্যাশ ডায়ালগটি দু'বার প্রদর্শিত হবে ।
  • প্রক্রিয়াটির সাক্ষ্যগ্রহণের সাথে এর কোনও যোগসূত্র নেই। Wow64 স্তরটি বেশ কুখ্যাত, তবে যে কোনও এসিপিইউ বিল্ড একইভাবে ক্র্যাশ হয়।
  • .NET সংস্করণ, 4.5 এবং 3.5 একইভাবে ক্র্যাশ করার সাথে এর কোনও যোগসূত্র নেই।
  • প্রস্থান কোডটি কোনও ব্যাপার নয়।
  • প্রস্থান () থেকে কল করার আগে থ্রেড.স্লিপ () কে কল করা এটি ঠিক করে না।
  • এটি উইন্ডোজ 8 এর 64৪-বিট সংস্করণে ঘটে এবং উইন্ডোজ একইভাবে প্রভাবিত হবে বলে মনে হয় না।
  • এটি তুলনামূলকভাবে নতুন আচরণ হওয়া উচিত, আমি এটি আগে দেখিনি। আমি উইন্ডোজ আপডেটের মাধ্যমে সরবরাহিত কোনও প্রাসঙ্গিক আপডেট দেখতে পাচ্ছি না , যদিও আপডেটের ইতিহাসটি আমার মেশিনে আর সঠিক নয়।
  • এটি চূড়ান্তভাবে ব্রেকিং আচরণ। আপনি অ্যাপডোমেনের জন্য ইভেন্ট হ্যান্ডলারে এই জাতীয় কোড লিখবেন nহানডেলড এক্সসেপশন এবং এটি একইভাবে ক্র্যাশ হয়ে গেছে।

আমি বিশেষত আগ্রহী যে আপনি সম্ভবত এই ক্রাশটি এড়াতে কী করতে পারেন। বিশেষত অ্যাপডোমাইন U .NET প্রোগ্রামটি শেষ করার উপায় নেই। অনুগ্রহ করে নোট করুন যে কলিং অ্যাপ্লিকেশন xএক্সিট () বা ফর্ম.ক্লোজ () আনহানডেলড এক্সসেপশনটির জন্য কোনও ইভেন্ট হ্যান্ডলারের ক্ষেত্রে বৈধ নয়, সুতরাং তারা কার্যক্ষেত্র নয়।


আপডেট: মেহরদাদ উল্লেখ করেছেন যে চূড়ান্তকরণকারী থ্রেড সমস্যার অংশ হতে পারে। আমি মনে করি যে আমি এটি দেখছি এবং 2 দ্বিতীয় সময়সামগ্রীর জন্য কিছু প্রমাণও দেখছি যা সিএলআর চূড়ান্তকরণকারী থ্রেডটি কার্যকর করে শেষ করে।

ফাইনালাইজারটি নেটিভ উইন্ডো-এর অভ্যন্তরে orce ফরাসী এক্সিটম্যাসেজলুপ ()। সেখানে একটি আইস উইন্ডো () উইন 32 রয়েছে যা কোড অবস্থানের সাথে মোটামুটিভাবে মিল করে 0x3c অফসেট করে 32-বিট মোডে মেশিন কোডের দিকে তাকালে। দেখে মনে হচ্ছে ইসওয়াইন্ডো () অচল করে দেওয়া। আমি ইন্টার্নালদের জন্য ভাল স্ট্যাক ট্রেস পেতে পারি না তবে ডিবাগারটি মনে করে যে পি / ইনভোক কলটি কেবল ফিরে এসেছে। এটি ব্যাখ্যা করা শক্ত। আপনি যদি আরও ভাল স্ট্যাক ট্রেস পেতে পারেন তবে আমি এটি দেখতে পছন্দ করব। খনি:

System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.ForceExitMessageLoop() + 0x3c bytes
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Finalize() + 0x16 bytes
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12()  + 0xe bytes
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes

ফোর্সএক্সিটম্যাসেজলুপ কলের উপরে কিছুই নেই, নিয়ন্ত্রণহীন ডিবাগার সক্ষম করা আছে।


2
আমি এটি নেট। 4, 4 ক্লায়েন্ট প্রোফাইল, 3.5, 3.5 ক্লায়েন্ট প্রোফাইল, 3.0, এবং 2.0 দিয়ে চেষ্টা করেছি এবং সেগুলির কোনওটিতে ত্রুটি পাই নি। VS2010 ব্যবহার করে OS৪-বিট উইন্ডোজ OS হ'ল আমার ওএস।
স্টিভ

2
@ স্টিভ This happens on the 64-bit version of Windows 8হ্যান্স তাই বলেছেন!
পরিমল রাজ

7
আমি এটি (উইন 8, 64-বিট) তিরস্কার করতে পারি, আপনার কোডটি অনুলিপি / পেস্ট করেছি এবং একটি বোতাম বেঁধে দিতে পেরেছি এবং বর্ণিত সঠিক লক্ষণগুলি পেয়েছি।
keyboardP

3
কোনও কনসোল মোড অ্যাপ্লিকেশন এই সমস্যাটি প্রদর্শন করতে পারে না, প্রস্থান () বার্তা পাম্প করার সময় কিছুই ভুল হতে পারে না।
হ্যানস প্যাস্যান্ট

3
Exit(0)কিছুটা আগে আমি কিছুটা 64৪ বিট উইন with দিয়ে এই ধরণের আচরণের মুখোমুখি হয়েছি , পরিবর্তন করা কোনও সমস্যা ছাড়াই ExitCodeএখন ব্যবহার করা সাহায্য করে নাProcess.GetCurrentProcess().Kill()
শ্রীরাম সাখাটিভেল

উত্তর:


85

আমি এই সমস্যা সম্পর্কে মাইক্রোসফ্টের সাথে যোগাযোগ করেছি এবং মনে হয় এটি পরিশোধ হয়ে গেছে। কমপক্ষে আমি এটি ভাবতে চাই :)। যদিও আমি তাদের কাছ থেকে কোনও সমাধানের নিশ্চয়তা পাইনি, উইন্ডোজ গ্রুপের সাথে সরাসরি যোগাযোগ করা কঠিন এবং আমাকে একটি মধ্যস্থতাকারী ব্যবহার করতে হয়েছিল।

উইন্ডোজ আপডেটের মাধ্যমে বিতরণ করা একটি আপডেট সমস্যার সমাধান করে। ক্র্যাশের আগে লক্ষণীয় 2 সেকেন্ড বিলম্ব আর উপস্থিত নেই, দৃ strongly়ভাবে পরামর্শ দিচ্ছে যে ইসওয়াইন্ডো () অচলাবস্থার সমাধান হয়েছে। এবং প্রোগ্রামটি পরিষ্কার এবং নির্ভরযোগ্যভাবে বন্ধ হয়ে যায়। আপডেটটি উইন্ডোজ ডিফেন্ডার, wdboot.sys, wdfilter.sys, tcpip.sys, rpcrt4.dll, uxtheme.dll, crypt32.dll এবং wintrust.dll জন্য প্যাচ ইনস্টল করেছে

Uxtheme.dll বিজোড়-হাঁস আউট। এটি ভিজ্যুয়াল স্টাইলগুলি থিমিং এপিআই প্রয়োগ করে এবং এই পরীক্ষামূলক প্রোগ্রামটি ব্যবহার করে। আমি নিশ্চিত হতে পারি না, তবে আমার অর্থ সমস্যার উত্স হিসাবে সেই একটিতে রয়েছে। সি: \ উইন্ডোজ 32 সিস্টেম 32 এর অনুলিপিটির সংস্করণ নম্বর 6.2.9200.16660 রয়েছে, এটি আমার মেশিনে 14 ই আগস্ট, 2013-এ তৈরি হয়েছিল।

মামলা বন্ধ.


11
উইন্ডোজ আপডেটের ইতিহাস আমার মেশিনে আর সঠিক নয়। আমি শুধু জানি এটি 14 ই আগস্ট ইনস্টল করা হয়েছে।
হ্যান্স প্যাস্যান্ট

51

আমি জানি না কেন এটি "আর" কাজ করে না , তবে আমি মনে করি Environment.Exitপেন্ডিং চূড়ান্তকারীদের কার্যকর করে। Environment.FailFastনা।

এটি হতে পারে যে (কোনও উদ্ভট কারণে) আপনার কাছে অদ্ভুত মুলতুবি চূড়ান্ত রয়েছে যা অবশ্যই পরে চালানো উচিত, যার ফলে এটি ঘটতে পারে।


2
আপনি কিছু হতে পারে। ফাইনালাইজারটি নেটিভ উইন্ডো.ফোর্সএক্সিটম্যাসেজলুপ () চালাতে ব্যস্ত। অদ্ভুতরূপে এটি কোনও কলে বাসা বাঁধে না।
হ্যান্স প্যাস্যান্ট

@ হ্যান্সপাস্যান্ট: আমি আশা করি যে আমি বিষয়টিটির তীব্র প্রতিবেদন করতে পারলাম যাতে আমি এটি খতিয়ে দেখতে পারি তবে আমি পারছি না। কলটি কি NativeWindow.ForceExitMessageLoopপরিচালনা বা নিয়ন্ত্রণহীন কোডটিতে আটকে আছে? এটি কি আটকা পড়েছে, বা ব্যস্ত-অপেক্ষায় বা কোনও বার্তার জন্য অপেক্ষা করছে বা অন্য কিছু?
ব্যবহারকারী541686

এটি অবশ্যই মূল সমস্যার দিকে ইঙ্গিত করে বলে মনে হচ্ছে। আমি মনে করি এটি ইসওয়াইন্ডো () উইনাপি ফাংশন যা সমস্যার মূলে রয়েছে। আমি মনে করি আমি চূড়ান্তকরণকারী থ্রেডে দ্বিতীয় দ্বিতীয় সময়সীমাটিও দেখছি, এর পরে এটি সমস্ত জাহান্নামে চলেছে। ডিবাগার এটি ইসওয়াইন্ডো () কলটি সম্পাদন করে দেখায় না তবে আমি উইন্ডোজটির অভ্যন্তরে সমালোচনামূলক কোড প্রবেশের সময় উইন্ডোজটিকে স্ট্যাকের সাথে খেলতে কৌশলগুলি খেলতে দেখেছি।
হ্যানস প্যাস্যান্ট

4
আমি মনে করি এনভায়রনমেন্ট.ফেইয়েলফাস্ট () পদ্ধতিটি, নিরপেক্ষ ব্যতিক্রমগুলির প্রদত্ত ক্ষেত্রে, যাইহোক, সম্ভবত সর্বোত্তম পদ্ধতি use (আমি এটি সম্পর্কে অবগত ছিলাম না - ধন্যবাদ!) তবে এমন অনেক লিগ্যাসি কোড রয়েছে যা এনভায়রনমেন্ট ব্যবহার করবে xএক্সিট () যা দুর্ভাগ্যক্রমে দুর্ভাগ্যবশত: ক্রমশ :(
ইয়ান ইয়েটস

2
আপনি অবশ্যই কোনও কিছুর প্রতি অবশ্যই আমার ক্ষেত্রে, আমি কিছু সংহতকরণ পরীক্ষার জন্য IHost.StartAsync ব্যবহার করে একটি IHost শুরু করেছি এবং এখনও IHost.StopAsync কল করার পরে (এবং অবশ্যই অপেক্ষা করছি), প্রক্রিয়াটি এখনও শেষ হয়নি। IHost.Dispose কল করার পরেই প্রক্রিয়াটি সমাপ্ত হয়।
টিপটির

6

এটি কেন ঘটছে তা ব্যাখ্যা করে না, তবে আমি Environment.Exitআপনার নমুনার মতো একটি বোতাম ইভেন্ট হ্যান্ডলারে কল করব না - পরিবর্তে পুনরায় উত্তরের পরামর্শ অনুসারে মূল ফর্মটি বন্ধ করুন ।

কোনও AppDomain.UnhandledExceptionহ্যান্ডলার হিসাবে , সম্ভবত আপনি Environment.ExitCodeকল করার চেয়ে ঠিক সেট করতে পারেন Environment.Exit

আপনি এখানে কী অর্জন করতে চাইছেন তা আমি নিশ্চিত নই। আপনি উইন্ডোজ ফর্ম অ্যাপ্লিকেশন থেকে কেন একটি প্রস্থান কোড ফেরত চান? সাধারণত প্রস্থান কোডগুলি কনসোল অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয়।

এই ক্র্যাশ কলিং এনভায়রনমেন্ট এড়াতে আপনি সম্ভবত যা করতে পারেন তার জন্য আমি বিশেষভাবে আগ্রহী the WER ডায়ালগটি প্রদর্শিত হতে আটকাতে এক্সেক্সট () প্রয়োজন।

আপনার কি মেইন পদ্ধতিতে চেষ্টা / ধরা আছে? উইন্ডোজ ফর্ম অ্যাপ্লিকেশনগুলির জন্য আমার কাছে সর্বদা চেষ্টা / বার্তা লুপের পাশাপাশি অবিবাহিত ব্যতিক্রম হ্যান্ডলারের কাছাকাছি থাকতে হবে।


খুব অবশ্যই আপনার Application.Exitপরিবর্তে কল করার কথা Environment.Exit
ব্যবহারকারী541686

7
দুঃখিত, এটি কোনও কাজ নয়। কলিং এনভায়রনমেন্ট xএক্সিট () ডাব্লুআরইআর ডায়ালগটি প্রদর্শিত হতে আটকাতে প্রয়োজনীয়। "পরিচিত তথ্য" হিসাবেও নোট করুন, প্রস্থান কোডটি কোনও বিষয় নয়।
হ্যানস প্যাস্যান্ট

7
@ હંস: অ্যাপডোমাইনকে ধরছে? ডাব্লুআরইআর ডায়ালগটিকে বৈধতা দেওয়ার প্রথম দিকে বৈধ চেষ্টা করার জন্য অনুগ্রহপূর্বক ধারণা? আমি বোঝাতে চাইছি, যদি একটি অপরিবর্তিত ব্যতিক্রম থাকে তবে ডাবল ডায়ালগটি দেখানোর কথা , তাই না?
হ্যারি জনস্টন

2

আমি আমাদের অ্যাপ্লিকেশনটিতে একই সমস্যা পেয়েছি, আমরা এটি নিম্নলিখিত নির্মাণের সাথে সমাধান করেছি:

Environment.ExitCode=1;
Application.Exit();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.