কেন খালি চেষ্টা ব্লক দিয়ে try} অবশেষে {try ব্যবহার করবেন?


239

আমি লক্ষ্য করেছি System.Threading.TimerBase.Dispose()পদ্ধতিটিতে একটি try{} finally{}ব্লক আছে তবে এটি try{}খালি রয়েছে।

try{} finally{}খালি ব্যবহার করে কি কোনও মূল্য আছে try?

http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Threading&type=TimerBase

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal bool Dispose(WaitHandle notifyObject)
{
    bool status = false;
    bool bLockTaken = false;
    RuntimeHelpers.PrepareConstrainedRegions();
    try {
    }
    finally {
        do {
            if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
                bLockTaken = true;
                try {
                    status = DeleteTimerNative(notifyObject.SafeWaitHandle);
                }
                finally {
                    m_lock = 0;
                }
            }
            Thread.SpinWait(1);
            // yield to processor
        }
        while (!bLockTaken);
        GC.SuppressFinalize(this);
    }

    return status;
}

উত্তর:


171

Http://blog.somecreativity.com/2008/04/10/the-empty-try- block-mystery / থেকে :

এই পদ্ধতিটি একটি থ্রেডের বিরুদ্ধে রক্ষা করে b থ্রেড.এবার্টের এমএসডিএন পৃষ্ঠাটি বলেছে যে "থ্রেডটি বাতিল হওয়ার আগে অবশেষে অবরুদ্ধ ব্লকগুলি কার্যকর করা হয়"। সুতরাং আপনার প্রসেসিংটি শেষ হয়ে গেছে এমনকি যদি আপনার থ্রেডটিতে কেউ Abort কল করে মাঝখানে আপনার থ্রেডটি বাতিল করে দেয় তবে আপনি আপনার সমস্ত কোডটি শেষ অবধি আটকে রাখতে পারেন (বিকল্পটি "ক্যাচ" ব্লকে কোড লিখতে হবে) আপনি কোথায় ছিলেন আগে নির্ধারণ করুন "চেষ্টা" অ্যাওর্ট দ্বারা বাধা পেয়েছিল এবং আপনি চাইলে সেখান থেকে এগিয়ে যান)।



15
কারণ এটি নেট .০.০.২০১৮
হ্যান্স প্যাস্যান্ট

6
@ রবফোনসেকা-এনসোর: যেহেতু Thread.BeginCriticalRegion()কোনও থ্রেড বাতিল হওয়া থেকে বিরত রাখে না , বরং রানটাইমকে বলে যে যদি কোনও থ্রেড বাতিল করা হয় তবে বিশ্বব্যাপী রাষ্ট্রটি দুর্নীতিগ্রস্ত এবং পুরো অ্যাপডোমেনটি করুণাময় হ'ল।
kkm

9
@ হ্যান্সপাস্যান্ট: BeginCriticalSection()নেট নেট 1.x তে আসলে ছিল না, তবে এর কোনও কারণ ও প্রভাব নেই, কারণ আপনি বলার কারণেই বোঝাচ্ছেন । প্রকৃতপক্ষে। নেট 1.x এ, এমনকি কোনও finallyব্লক কোনও থ্রেড অ্যাওর্ট দ্বারা বাধা দিতে পারে। এই ব্যবস্থাগুলি একটি পৃথক উদ্দেশ্য পরিবেশন করে: কাজ করা একটি finallyকোডের মাঝপথে বাতিল হওয়া রোধ করে, যখন BeginCriticalSection()কেবল রানটাইমকে ঘোষণা করে যে বৈশ্বিক রাষ্ট্র ঝুঁকিতে রয়েছে।
kkm

যদি ডেভেলপারের অবশেষে কিছুটা (সত্য) থাকে তবে কি এই गर्भपातটি কখনও সম্পূর্ণ হবে বা প্রযুক্তিগতভাবে কোনওভাবেই অনির্দিষ্টকালের জন্য উপেক্ষা করা যেতে পারে?
ম্যাক্স ইয়ং

64

এটি Thread.Abortকোনও প্রক্রিয়া বাধাদান থেকে রক্ষা করা । এই পদ্ধতির জন্য ডকুমেন্টেশন বলে যে:

থ্রেডটি বাতিল হওয়ার আগে অবশেষে অবরুদ্ধ ব্লকগুলি কার্যকর করা হয়।

এটি কারণ কোনও ত্রুটি থেকে সফলভাবে পুনরুদ্ধার করার জন্য, আপনার কোডটি নিজের পরে পরিষ্কার করা দরকার need যেহেতু সি # তে সি ++ নেই - স্টাইলের ডেস্ট্রাক্টর finallyএবং usingব্লকগুলি একমাত্র নির্ভরযোগ্য উপায় যে এই ধরণের ক্লিনআপটি নির্ভরযোগ্যভাবে সম্পাদিত হয়। মনে রাখবেন যে usingব্লকটি কম্পাইলার দ্বারা এটিতে পরিণত হয়:

try {
    ...
}
finally {
    if(obj != null)
        ((IDisposable)obj).Dispose();
}

.NET 1.x এ, এমন একটি সুযোগ ছিল যে finallyব্লকটি বাতিল হয়ে যাবে। এই আচরণটি .NET 2.0 তে পরিবর্তন করা হয়েছিল।

তদুপরি, খালি tryব্লকগুলি কখনই সংকলক দ্বারা অপ্টিমাইজড হয় না।


ব্যবহার ব্লক অন্তর্দৃষ্টি জন্য ধন্যবাদ।
স্টিফান

@ অ্যান্টন আমি বুঝতে পারি যে ব্যবহার করা একটি সর্বোত্তম অনুশীলন। তবে উপহাসের উদ্দেশ্যে, কখনও কখনও একটি মোড়কের ক্লাস প্রয়োগ করা দরকার এবং ডিসপোজেবল অবজেক্টটি একটি প্রাইভেট ক্লাসের ভেরিয়েবল হয়ে যায়। আমরা যদি এই মোড়কে ডিসপোজেবল করে তুলি, তবে জিসি তখন কি স্বয়ংক্রিয়ভাবে প্রাইভেট ক্লাসের ভেরিয়েবলের ডিসপোজিং পরিচালনা করে না?
ওজকান

@ ওজকান জিসি কিছু স্বয়ংক্রিয়ভাবে নিষ্পত্তি করে না। আপনাকে একটি চূড়ান্তকরণকারী কার্যকর করতে হবে, সাধারণত একটি বলে Dispose(false);docs.microsoft.com/en-us/dotnet/standard/garbage-collection/...
Thorarin

@ থোররিন দুঃখিত, তবে আপনি জিসি স্বয়ংক্রিয়ভাবে নিষ্পত্তি করবেন না (চূড়ান্তকরণ করছেন) বলে ভুল করছেন।
ওজকান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.