কোনও টাস্কের ব্যতিক্রম (গুলি) টাস্কের অপেক্ষায় বা এর ব্যতিক্রম সম্পত্তি অ্যাক্সেসের মাধ্যমে পালন করা হয়নি। ফলস্বরূপ, অরক্ষিত ব্যতিক্রম ছিল


100

এর অর্থ কী এবং কীভাবে সমাধান করা যায়?

আমি টিপিএল টাস্ক ব্যবহার করছি।

পুরো ত্রুটি

কোনও টাস্কের ব্যতিক্রম (গুলি) টাস্কের অপেক্ষায় বা এর ব্যতিক্রম সম্পত্তি অ্যাক্সেসের মাধ্যমে পালন করা হয়নি। ফলস্বরূপ, অরক্ষিত ব্যতিক্রমটি চূড়ান্তকরণকারী থ্রেড দ্বারা পুনরায় উত্থিত হয়েছিল।

System.Threading.Tasks.TaskExceptionHolder.Finalize () এ

mscorlib

উত্তর:


158

যদি আপনি কোনও টাস্ক তৈরি করেন এবং আপনি কখনই কল task.Wait()বা কোনওটির ফলাফল পুনরুদ্ধারের চেষ্টা না করেন Task<T>, যখন আবর্জনা সংগ্রহকারী দ্বারা কাজটি সংগ্রহ করা হয়, এটি চূড়ান্তকরণের সময় আপনার আবেদনটি ছিন্ন করে। বিশদর জন্য, টিপিএলে ব্যতিক্রম হ্যান্ডলিংয়ের উপর এমএসডিএন এর পৃষ্ঠাটি দেখুন ।

এখানে সর্বোত্তম বিকল্পটি ব্যতিক্রমটি "পরিচালনা" করা। এটি একটি ধারাবাহিকতার মাধ্যমে করা যেতে পারে - আপনি টাস্কের সাথে একটি ধারাবাহিকতা সংযুক্ত করতে পারেন এবং লগ / গেলা / ইত্যাদি ব্যতিক্রম ঘটে। এটি টাস্ক ব্যতিক্রমগুলিকে লগ করার জন্য একটি পরিষ্কার উপায় সরবরাহ করে এবং এটি একটি সাধারণ এক্সটেনশন পদ্ধতি হিসাবে লেখা যেতে পারে, যেমন:

public static void LogExceptions(this Task task)
{
    task.ContinueWith( t =>
    {
         var aggException = t.Exception.Flatten();
         foreach(var exception in aggException.InnerExceptions)
             LogException(exception);
    }, 
    TaskContinuationOptions.OnlyOnFaulted);
}

উপরের সাহায্যে আপনি যে কোনও কাজ অ্যাপটি ছিঁড়ে ফেলা এবং এটি লগ করা থেকে রোধ করতে পারেন:

Task.Factory.StartNew( () => 
   { 
       // Do your work...
   }).LogExceptions();

বিকল্পভাবে, আপনি টাস্কশুলেডারঅনোব্রেটেড টাস্কএক্সসেপশন সাবস্ক্রাইব করতে পারেন এবং এটি সেখানে পরিচালনা করতে পারেন ।


17
যুক্ত বিনোদনের জন্য, Offআপনার পছন্দের চার-বর্ণের শব্দ নামে একটি শ্রেণিতে একটি স্ট্যাটিক স্টাব পদ্ধতি রাখুন এবং এটি আপনার ক্যাচ-অল ক্রমাগত জন্য ব্যবহার করুন। এই বিশেষ ব্যতিক্রম থেকে কিছু পেন্ট-আপ হতাশার বিরুদ্ধে লড়াই করতে সহায়তা করে।
অ্যারোনআউট

1
@ মনস্টার এমএমওরপিজি হ্যাঁ - আপনাকে মূলত ব্যতিক্রমটি কোথাও ধরতে বা পরিচালনা করতে হবে । যতক্ষণ আপনি এটি কোথাও পরিচালনা করবেন আপনার মূল সমস্যাটি চলে যাবে।
রিড কোপসি 0

1
চালিয়ে যাওয়া উইথ কল করার আগে কী সম্ভব নয় যে টাস্কটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে?
টিম সিলভেস্টার

1
@ টিমসিলভেস্টার কাঠামোটি এখনও এটির ধারাবাহিকতার মধ্য দিয়ে মানচিত্র তৈরি করবে, এমনকি যদি এটির ধারাবাহিকতাটি সংযুক্ত হওয়ার আগে "এর আগে" ঘটে থাকে
রিড কোপসি

32
গুরুত্বপূর্ণ দ্রষ্টব্য: এটি কেবলমাত্র প্রয়োজনীয় .Net 4.0অ্যাপ্লিকেশন ছিন্ন না.net 4.5 করার জন্য ব্যতিক্রম হ্যান্ডলিংটি ডিফল্টরূপে পরিবর্তিত হয়েছিল । আরও দেখুন .NET 4.5 টাস্ক ব্যতিক্রম হ্যান্ডলিং
i3arnon

43

নিশ্চিত; এর অর্থ এটি Taskআবর্জনা সংগ্রহের পরে ছেড়ে যাওয়ার পরে একটি চূড়ান্ত হয়ে গেছে, তবে কাজটি নিজেই ব্যর্থ হয়েছিল। দুটি ফিক্স আছে:

  • হ্যান্ডেল কর্ম সরাসরি (ব্যবহারের ব্যর্থ ContinueWith(...)সাবস্ক্রাইব, এবং চেক .IsFaultedএবং .Exceptionউপর Taskপরামিতি মধ্যে)
  • TaskScheduler.UnobservedTaskExceptionইভেন্টটি পরিচালনা করুন এবং এটি পর্যবেক্ষণ করে চিহ্নিত করুন ( e.SetObserved()ত্রুটিটি লগ করার পরে কল করুন )

4
+1 - একটি সংযোজন সহ - যদি আপনার ধারাবাহিকতা পরীক্ষা করা ছাড়া কিছুই না করে তবে IsFaultedআপনি OnlyOnFaultedধারাবাহিকতা বিকল্পটি ব্যবহার করতে পারেন এবং ম্যানুয়াল চেক এড়াতে পারবেন ...
রিড কোপসি

আসলে এটি ঘটেছিল যেখানে আমি একটি টিপিএল টাস্কের ভিতরে একটি পাবলিক স্ট্যাটিক ফাংশন বলেছিলাম। ক্যাচ ব্যবহার করে এই সমস্যার সমাধান হবে? আমার কি আসলেই অন্য কোনও কাজ তৈরি এবং এটির অপেক্ষা করা দরকার? ধন্যবাদ
MonstermmORPG

4
উল্লেখ যে জন্য +1 SetObservedউপর UnobservedTaskExceptionEventArgsচাহিদা বলা হবে।
জেমস ওয়েবস্টার

-17

আর একবার চেষ্টা কর:

public static void ThrowFirstExceptionIfHappens(this Task task)
{
    task.ContinueWith(t =>
    {
        var aggException = t.Exception.Flatten();
        foreach (var exception in aggException.InnerExceptions)
        {
            throw exception; // throw only first, search for solution
        }
    },
    TaskContinuationOptions.OnlyOnFaulted); // not valid for multi task continuations
}

public static Task CreateHandledTask(Action action) 
{
    Task tsk = Task.Factory.StartNew(action);
    tsk.ThrowFirstExceptionIfHappens();
    return tsk;
}

5
এটা একটা ??? আপনি কি বোঝাতে চেয়েছেন? আপনার উত্তর এতদূর উত্তরগুলিতে কী অবদান রাখে তা আপনি ব্যাখ্যা করতে পারেন?
গার্ট আর্নল্ড

আপনি চালিয়ে যাওয়ার মাধ্যমে সবেমাত্র একটি নতুন কাজ তৈরি করেছেন যা ব্যর্থ হবে এবং একই পরিস্থিতিতে পড়বে।
রবার্ট টেলর

এই সমাধানটি কিছুটা বিশৃঙ্খল বলে মনে হচ্ছে। আমি মনে করি আপনি কোনও লাভ ছাড়াই অনিচ্ছাকৃত কার্যকারিতা লুকিয়ে রাখবেন।
ভেলোকিটাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.