সি # জেনেরিক সময়সীমা কার্যকর করুন


157

টাইমআউট সহ কোডের একটি একক লাইন (বা বেনামে প্রতিনিধি) কার্যকর করার জন্য জেনেরিক উপায় বাস্তবায়নের জন্য আমি ভাল ধারণা খুঁজছি।

TemperamentalClass tc = new TemperamentalClass();
tc.DoSomething();  // normally runs in 30 sec.  Want to error at 1 min

আমি এমন একটি সমাধানের সন্ধান করছি যা আমার কোড মেজাজী কোডের সাথে ইন্টারেক্ট করে (যেখানে আমি পরিবর্তন করতে পারি না) এমন অনেক জায়গায় মার্জিতভাবে প্রয়োগ করা যেতে পারে।

তদতিরিক্ত, আমি যদি সম্ভব হয় তবে আপত্তিজনক "টাইম আউট" কোডটি আরও কার্যকর করা থেকে বিরত রাখতে চাই।


46
নীচের উত্তরগুলি দেখার জন্য যে কাউকে কেবল একটি অনুস্মারক: তাদের মধ্যে অনেকেই থ্রেড ব্যবহার করেন bএবোর্ট যা খুব খারাপ হতে পারে। আপনার কোডে Abort কার্যকর করার আগে দয়া করে এ সম্পর্কে বিভিন্ন মন্তব্য পড়ুন। এটি উপলক্ষ্যে উপযুক্ত হতে পারে তবে এগুলি বিরল। যদি আপনি ঠিক বুঝতে না পারেন যে অ্যাবোর্ট কী করে বা এটির প্রয়োজন হয় না, দয়া করে নীচের একটি সমাধান প্রয়োগ করুন যা এটি ব্যবহার করে না। এগুলিই এমন সমাধান যা এর বেশি ভোট নেই কারণ তারা আমার প্রশ্নের প্রয়োজনীয়তার সাথে খাপ খায় নি।
চিলটেম্প

পরামর্শের জন্য ধন্যবাদ। +1 ভোট।
কুইউহ্যামার

7
থ্রেডের বিপদগুলি সম্পর্কে বিশদ বিশদে বিশদ সম্পর্কে, এরিক লিপার্টের এই নিবন্ধটি পড়ুন: ব্লগস.এমএসএনএন
বি

উত্তর:


95

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

আপনার উপভোগের জন্য আমি এই উদাহরণটি জমা দিই। আপনি যে পদ্ধতিতে সত্যই আগ্রহী তা হ'ল কলবিথটাইমআউট। এটি দীর্ঘকালীন চলমান থ্রেডটিকে বাতিল করে এবং থ্রেডঅবর্টেক্সপশন গ্রাস করে বাতিল করবে :

ব্যবহার:

class Program
{

    static void Main(string[] args)
    {
        //try the five second method with a 6 second timeout
        CallWithTimeout(FiveSecondMethod, 6000);

        //try the five second method with a 4 second timeout
        //this will throw a timeout exception
        CallWithTimeout(FiveSecondMethod, 4000);
    }

    static void FiveSecondMethod()
    {
        Thread.Sleep(5000);
    }

স্থির পদ্ধতিটি কাজ করছে:

    static void CallWithTimeout(Action action, int timeoutMilliseconds)
    {
        Thread threadToKill = null;
        Action wrappedAction = () =>
        {
            threadToKill = Thread.CurrentThread;
            try
            {
                action();
            }
            catch(ThreadAbortException ex){
               Thread.ResetAbort();// cancel hard aborting, lets to finish it nicely.
            }
        };

        IAsyncResult result = wrappedAction.BeginInvoke(null, null);
        if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
        {
            wrappedAction.EndInvoke(result);
        }
        else
        {
            threadToKill.Abort();
            throw new TimeoutException();
        }
    }

}

3
কেন ধরা (ThreadAbortException)? আফাইক আপনি সত্যিই একটি থ্রেডঅবর্ট এক্সসেপশন ধরতে পারবেন না (ক্যাচ ব্লকটি ছেড়ে যাওয়ার পরে এটি পুনর্বিবেচনা করা হবে)।
csgero

12
থ্রেড.এবার্ট () ব্যবহার করা অত্যন্ত বিপজ্জনক, এটি নিয়মিত কোডের সাথে ব্যবহার করা উচিত নয়, কেবল নিরাপদ থাকার গ্যারান্টিযুক্ত কোডটি বাতিল করা উচিত, যেমন কোডটি যে সেরে.সেফ, সীমাবদ্ধ বাস্তবায়ন অঞ্চল এবং নিরাপদ হ্যান্ডলগুলি ব্যবহার করে। এটি কোনও কোডের জন্য করা উচিত নয়।
পপ ক্যাটালিন

12
যদিও থ্রেড.এবার্ট () খারাপ, এটি কোনও প্রক্রিয়া নিয়ন্ত্রণের বাইরে চলে এবং কম্পিউটারের প্রতিটি সিপিইউ চক্র এবং পিসির মেমরির বাইট ব্যবহার করার মতো খারাপ নয়। তবে আপনি যে কারও কাছে এই কোডটি কার্যকর বলে মনে করছেন এমন সম্ভাব্য সমস্যাগুলি উল্লেখ করার পক্ষে ঠিক।
চিলটেম্প

24
আমি বিশ্বাস করতে পারি না এটি গৃহীত উত্তর, কেউ অবশ্যই মন্তব্যগুলি এখানে পড়ছেন না, বা মন্তব্যের আগে উত্তরটি গৃহীত হয়েছিল এবং সেই ব্যক্তি তার উত্তর পৃষ্ঠা পরীক্ষা করে না। থ্রেড.এবোর্ট কোনও সমাধান নয়, এটি সমাধান করার জন্য এটি কেবল আপনার আরেকটি সমস্যা!
লাসে ভি কার্লসেন

18
আপনি মন্তব্য পড়ছেন না। উপরে চিলটেম্প যেমন বলেছে, সে কোডিং কোড করছে যে তার কোনও নিয়ন্ত্রণ নেই - এবং এটি বাতিল করতে চায়। থ্রেড ছাড়া তাঁর আর কোনও বিকল্প নেই Aআবার্ট () তিনি যদি চান তবে এটি তার প্রক্রিয়াটির মধ্যে চলে। আপনি ঠিক বলেছেন যে থ্রেড.আবার্টটি খারাপ - তবে চিলটেম্পের মতো, অন্যান্য জিনিস আরও খারাপ!
TheSoftwareJedi

73

আমরা প্রোডাটিও এনগুলিতে এই জাতীয় কোডটি ভারীভাবে ব্যবহার করছি :

var result = WaitFor<Result>.Run(1.Minutes(), () => service.GetSomeFragileResult());

বাস্তবায়ন ওপেন সোর্সযুক্ত, সমান্তরাল কম্পিউটিং পরিস্থিতিতে এমনকি দক্ষতার সাথে কাজ করে এবং লোকাদ শেয়ারড লাইব্রেরিগুলির অংশ হিসাবে উপলব্ধ

/// <summary>
/// Helper class for invoking tasks with timeout. Overhead is 0,005 ms.
/// </summary>
/// <typeparam name="TResult">The type of the result.</typeparam>
[Immutable]
public sealed class WaitFor<TResult>
{
    readonly TimeSpan _timeout;

    /// <summary>
    /// Initializes a new instance of the <see cref="WaitFor{T}"/> class, 
    /// using the specified timeout for all operations.
    /// </summary>
    /// <param name="timeout">The timeout.</param>
    public WaitFor(TimeSpan timeout)
    {
        _timeout = timeout;
    }

    /// <summary>
    /// Executes the spcified function within the current thread, aborting it
    /// if it does not complete within the specified timeout interval. 
    /// </summary>
    /// <param name="function">The function.</param>
    /// <returns>result of the function</returns>
    /// <remarks>
    /// The performance trick is that we do not interrupt the current
    /// running thread. Instead, we just create a watcher that will sleep
    /// until the originating thread terminates or until the timeout is
    /// elapsed.
    /// </remarks>
    /// <exception cref="ArgumentNullException">if function is null</exception>
    /// <exception cref="TimeoutException">if the function does not finish in time </exception>
    public TResult Run(Func<TResult> function)
    {
        if (function == null) throw new ArgumentNullException("function");

        var sync = new object();
        var isCompleted = false;

        WaitCallback watcher = obj =>
            {
                var watchedThread = obj as Thread;

                lock (sync)
                {
                    if (!isCompleted)
                    {
                        Monitor.Wait(sync, _timeout);
                    }
                }
                   // CAUTION: the call to Abort() can be blocking in rare situations
                    // http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx
                    // Hence, it should not be called with the 'lock' as it could deadlock
                    // with the 'finally' block below.

                    if (!isCompleted)
                    {
                        watchedThread.Abort();
                    }
        };

        try
        {
            ThreadPool.QueueUserWorkItem(watcher, Thread.CurrentThread);
            return function();
        }
        catch (ThreadAbortException)
        {
            // This is our own exception.
            Thread.ResetAbort();

            throw new TimeoutException(string.Format("The operation has timed out after {0}.", _timeout));
        }
        finally
        {
            lock (sync)
            {
                isCompleted = true;
                Monitor.Pulse(sync);
            }
        }
    }

    /// <summary>
    /// Executes the spcified function within the current thread, aborting it
    /// if it does not complete within the specified timeout interval.
    /// </summary>
    /// <param name="timeout">The timeout.</param>
    /// <param name="function">The function.</param>
    /// <returns>result of the function</returns>
    /// <remarks>
    /// The performance trick is that we do not interrupt the current
    /// running thread. Instead, we just create a watcher that will sleep
    /// until the originating thread terminates or until the timeout is
    /// elapsed.
    /// </remarks>
    /// <exception cref="ArgumentNullException">if function is null</exception>
    /// <exception cref="TimeoutException">if the function does not finish in time </exception>
    public static TResult Run(TimeSpan timeout, Func<TResult> function)
    {
        return new WaitFor<TResult>(timeout).Run(function);
    }
}

এই কোডটি এখনও বগি, আপনি এই ছোট পরীক্ষা প্রোগ্রামটি দিয়ে চেষ্টা করতে পারেন:

      static void Main(string[] args) {

         // Use a sb instead of Console.WriteLine() that is modifying how synchronous object are working
         var sb = new StringBuilder();

         for (var j = 1; j < 10; j++) // do the experiment 10 times to have chances to see the ThreadAbortException
         for (var ii = 8; ii < 15; ii++) {
            int i = ii;
            try {

               Debug.WriteLine(i);
               try {
                  WaitFor<int>.Run(TimeSpan.FromMilliseconds(10), () => {
                     Thread.Sleep(i);
                     sb.Append("Processed " + i + "\r\n");
                     return i;
                  });
               }
               catch (TimeoutException) {
                  sb.Append("Time out for " + i + "\r\n");
               }

               Thread.Sleep(10);  // Here to wait until we get the abort procedure
            }
            catch (ThreadAbortException) {
               Thread.ResetAbort();
               sb.Append(" *** ThreadAbortException on " + i + " *** \r\n");
            }
         }

         Console.WriteLine(sb.ToString());
      }
   }

একটি রেসের শর্ত আছে। এটি স্পষ্টভাবে সম্ভব যে পদ্ধতিটি WaitFor<int>.Run()বলার পরে একটি থ্রেডঅবর্টেক্সপশন উত্থাপিত হয়। আমি এটি ঠিক করার কোনও নির্ভরযোগ্য উপায় খুঁজে পাইনি, তবে একই পরীক্ষার সাহায্যে আমি TheSoftwareJedi গৃহীত উত্তর নিয়ে কোনও সমস্যা তিরস্কার করতে পারি না ।

এখানে চিত্র বর্ণনা লিখুন


3
এটি আমি প্রয়োগ করেছি, এটি পরামিতিগুলি এবং রিটার্ন মানটি পরিচালনা করতে পারে, যা আমি পছন্দ করি এবং প্রয়োজনীয়। ধন্যবাদ রিনাত
গ্যাব্রিয়েল মনজিওন

7
[অপরিবর্তনীয়] কি?
রাক্লোস

2
পরিবর্তনযোগ্য ক্লাসগুলি চিহ্নিত করতে আমরা কেবল একটি বৈশিষ্ট্য ব্যবহার করি (একক পরীক্ষায় মনো-সিসিল দ্বারা অপরিবর্তনযোগ্যতা যাচাই করা হয়)
রিনাত আবদুলিন

9
এটি ঘটতে অপেক্ষা করা একটি অচলাবস্থা (আমি অবাক হয়েছি আপনি এটি এখনও পর্যবেক্ষণ করেননি)। আপনার ওয়াচডথ্রেড.আবার্ট () এ কল করা একটি লকের ভিতরে রয়েছে, যা শেষ অবধিও অর্জন করা দরকার। এর অর্থ হ'ল শেষ অবধি ব্লকটি লকের জন্য অপেক্ষা করছে (কারণ ওয়াচড্র্যাডটি এটি অপেক্ষা করুন () প্রত্যাবর্তন এবং থ্রেডের মধ্যে রয়েছে bআবার্ট ()), ওয়াচ থ্রেড.অবার্ট () কলটিও শেষ অবধি অপেক্ষা করার জন্য অনির্দিষ্টকালের জন্য ব্লক করবে (এটি এটি কখনো করবো না). Therad.Abort () যদি কোডের একটি সংরক্ষিত অঞ্চল চলমান ব্লক করে দিতে পারেন - ডেডলক ঘটাচ্ছে দেখুন - msdn.microsoft.com/en-us/library/ty8d3wta.aspx
trickdev

1
ট্রিকদেব, অনেক অনেক ধন্যবাদ কোনও কারণে, অচলাবস্থার ঘটনাটি খুব কম দেখা গেছে, তবে আমরা কোডটি তবুও ঠিক করেছি :-)
জোয়ানস ভারমোরেল

15

ঠিক আছে, আপনি প্রতিনিধিদের সাথে জিনিসগুলি করতে পারেন (বিগিনিউভোক, একটি কলব্যাক একটি পতাকা নির্ধারণ করে - এবং মূল পতাকাটি সেই পতাকা বা সময়সীমাটির জন্য অপেক্ষা করছে) - তবে সমস্যাটি হ'ল চলমান কোডটি বন্ধ করা খুব কঠিন। উদাহরণস্বরূপ, একটি থ্রেড হত্যা (বা বিরতি দেওয়া) বিপজ্জনক ... সুতরাং আমি মনে করি না দৃ this়ভাবে এটি করার সহজ উপায় আছে way

আমি এটি পোস্ট করব, তবে মনে রাখবেন এটি আদর্শ নয় - এটি দীর্ঘকালীন কাজটি থামায় না, এবং ব্যর্থতার কারণে এটি সঠিকভাবে পরিষ্কার হয় না।

    static void Main()
    {
        DoWork(OK, 5000);
        DoWork(Nasty, 5000);
    }
    static void OK()
    {
        Thread.Sleep(1000);
    }
    static void Nasty()
    {
        Thread.Sleep(10000);
    }
    static void DoWork(Action action, int timeout)
    {
        ManualResetEvent evt = new ManualResetEvent(false);
        AsyncCallback cb = delegate {evt.Set();};
        IAsyncResult result = action.BeginInvoke(cb, null);
        if (evt.WaitOne(timeout))
        {
            action.EndInvoke(result);
        }
        else
        {
            throw new TimeoutException();
        }
    }
    static T DoWork<T>(Func<T> func, int timeout)
    {
        ManualResetEvent evt = new ManualResetEvent(false);
        AsyncCallback cb = delegate { evt.Set(); };
        IAsyncResult result = func.BeginInvoke(cb, null);
        if (evt.WaitOne(timeout))
        {
            return func.EndInvoke(result);
        }
        else
        {
            throw new TimeoutException();
        }
    }

2
আমার উপর ছড়িয়ে পড়ে এমন কিছু হ'ল আমি পুরোপুরি খুশি। এটি পরবর্তী পুনরায় বুট না হওয়া পর্যন্ত এটি সিপিইউ চক্র খাওয়ার চেয়ে আরও ভাল (এটি একটি উইন্ডোজ পরিষেবার অংশ)।
চিলটেম্প

@ মার্ক: আমি আপনার দুর্দান্ত ভক্ত am তবে, আমি এবার ভাবছি, আপনি ফলাফলটি কেন ব্যবহার করলেন না Aআসেন্সওয়াইটহ্যান্ডল থসফটওয়ারজেদি দ্বারা উল্লিখিত হিসাবে। AsyncWaitHandle ওভারে ম্যানুয়ালসেটসেন্ট ব্যবহারের কোনও সুবিধা?
আনন্দ প্যাটেল

1
@ এবং ভাল, এটি কয়েক বছর আগে ছিল তাই আমি স্মৃতি থেকে উত্তর দিতে পারি না - তবে "বোঝা সহজ" থ্রেডেড কোডে অনেক কিছু গণনা করা হয়েছে
মার্ক গ্র্যাভেল

13

পপ ক্যাটালিনের দুর্দান্ত উত্তরে কিছু ছোটখাটো পরিবর্তন:

  • অ্যাকশনের পরিবর্তে ফানক
  • খারাপ সময়সীমা মান ব্যতিক্রম ছুঁড়ে
  • টাইমআউট হওয়ার ক্ষেত্রে এন্ডআইভোকে ফোন করা

কার্যকরকরণ বাতিল করতে সংকেত কর্মীদের সমর্থন করার জন্য ওভারলোডগুলি যুক্ত করা হয়েছে:

public static T Invoke<T> (Func<CancelEventArgs, T> function, TimeSpan timeout) {
    if (timeout.TotalMilliseconds <= 0)
        throw new ArgumentOutOfRangeException ("timeout");

    CancelEventArgs args = new CancelEventArgs (false);
    IAsyncResult functionResult = function.BeginInvoke (args, null, null);
    WaitHandle waitHandle = functionResult.AsyncWaitHandle;
    if (!waitHandle.WaitOne (timeout)) {
        args.Cancel = true; // flag to worker that it should cancel!
        /* •————————————————————————————————————————————————————————————————————————•
           | IMPORTANT: Always call EndInvoke to complete your asynchronous call.   |
           | http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.80).aspx           |
           | (even though we arn't interested in the result)                        |
           •————————————————————————————————————————————————————————————————————————• */
        ThreadPool.UnsafeRegisterWaitForSingleObject (waitHandle,
            (state, timedOut) => function.EndInvoke (functionResult),
            null, -1, true);
        throw new TimeoutException ();
    }
    else
        return function.EndInvoke (functionResult);
}

public static T Invoke<T> (Func<T> function, TimeSpan timeout) {
    return Invoke (args => function (), timeout); // ignore CancelEventArgs
}

public static void Invoke (Action<CancelEventArgs> action, TimeSpan timeout) {
    Invoke<int> (args => { // pass a function that returns 0 & ignore result
        action (args);
        return 0;
    }, timeout);
}

public static void TryInvoke (Action action, TimeSpan timeout) {
    Invoke (args => action (), timeout); // ignore CancelEventArgs
}

ইনভোক (ই => {// ... যদি (ত্রুটি) ই। ক্যানসেল = সত্য; রিটার্ন 5; Time, টাইমস্প্যান.ফ্রমসেকেন্ডস (5%);
জর্জ টিসিয়োকস

1
এটি উল্লেখ করার মতো যে এই উত্তরে 'টাইম আউট' পদ্ধতিটি চালানো ছেড়ে দেওয়া হয় যদি না এটি 'বাতিল' দিয়ে পতাকাঙ্কিত হওয়ার সময় বিনয়ের সাথে প্রস্থান করতে বেছে নেওয়া যায়।
ডেভিড আইসন

ডেভিড, এটাই হ'ল বাতিলকরণ টোকেন টাইপ (.NET 4.0) বিশেষভাবে সম্বোধনের জন্য তৈরি করা হয়েছিল। এই উত্তরে আমি ক্যান্সেলএভেন্টআরগসটি ব্যবহার করেছি যাতে কর্মী আরগসটি পোল করতে পারে। এটি বেরিয়ে আসে কিনা তা দেখতে কনসেল করুন, যদিও এটি নেট। 4.0 এর জন্য বাতিলকরণ টোকেনের সাথে পুনরায় প্রয়োগ করা উচিত।
জর্জ টিসিয়োকস

এই সম্পর্কে একটি ব্যবহারের নোট যা আমাকে কিছুক্ষণের জন্য বিভ্রান্ত করেছে: আপনার ফাংশন / অ্যাকশন কোডের সময়সীমা শেষ হওয়ার পরে যদি কোনও ব্যতিক্রম ছড়িয়ে দিতে পারে তবে আপনার দুটি চেষ্টা / ক্যাপ ব্লক দরকার। টাইমআউটএক্সসেপশন ধরার জন্য ইনভোকের কলটির জন্য আপনার একবার চেষ্টা / ক্যাপচার দরকার। আপনার সময়সীমা নিক্ষেপের পরে ঘটতে পারে এমন কোনও ব্যতিক্রম ক্যাপচার এবং গিলতে / লগ করতে আপনার ফাংশন / অ্যাকশনের ভিতরে আপনাকে একটি সেকেন্ডের প্রয়োজন। তা না হলে অ্যাপ্লিকেশানটি কোনো Unhandled ব্যতিক্রম সঙ্গে বন্ধ করে দেব (আমার ব্যবহারের ক্ষেত্রে পিং একটি WCF app.config উল্লেখিত চেয়ে একটি কঠিন সময় সমাপ্ত সংযোগ পরীক্ষা করছে)
ক্ষমতাপ্রদান

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

10

আমি এটি এইভাবে করব:

public static class Runner
{
    public static void Run(Action action, TimeSpan timeout)
    {
        IAsyncResult ar = action.BeginInvoke(null, null);
        if (ar.AsyncWaitHandle.WaitOne(timeout))
            action.EndInvoke(ar); // This is necesary so that any exceptions thrown by action delegate is rethrown on completion
        else
            throw new TimeoutException("Action failed to complete using the given timeout!");
    }
}

3
এটি কার্যকর করার কাজটি থামায় না
TheSoftwareJedi

2
সমস্ত কাজ বন্ধ করা নিরাপদ নয়, সব ধরণের সমস্যা আসতে পারে, অচলাবস্থা, সম্পদ ফাঁস, রাষ্ট্রের দুর্নীতি ... এটি সাধারণ ক্ষেত্রে করা উচিত নয়।
পপ ক্যাটালিন

7

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;


namespace TemporalThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            Action action = () => Thread.Sleep(10000);
            DoSomething(action, 5000);
            Console.ReadKey();
        }

        static void DoSomething(Action action, int timeout)
        {
            EventWaitHandle waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
            AsyncCallback callback = ar => waitHandle.Set();
            action.BeginInvoke(callback, null);

            if (!waitHandle.WaitOne(timeout))
                throw new Exception("Failed to complete in the timeout specified.");
        }
    }

}

1
খুশী হলাম। কেবলমাত্র আমি যুক্ত করব যে তিনি কেবল সিস্টেমের পরিবর্তে System.TimeoutException পছন্দ করতে পারেন E অনুগ্রহ
জোয়েল কোহোর্ন

ওহ, হ্যাঁ: এবং আমি এটি নিজের ক্লাসেও গুটিয়ে রাখি।
জোয়েল কোহর্ন

2

থ্রেড.জয়াইন (ইন টাইমআউট) ব্যবহার সম্পর্কে কী?

public static void CallWithTimeout(Action act, int millisecondsTimeout)
{
    var thread = new Thread(new ThreadStart(act));
    thread.Start();
    if (!thread.Join(millisecondsTimeout))
        throw new Exception("Timed out");
}

1
এটি কোনও সমস্যার কলিং পদ্ধতিকে অবহিত করবে তবে আপত্তিজনক থ্রেডটি বাতিল করবে না।
চিলটেম্প

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