سؤال

وأريد لاختبار إذا سلسلة الاتصال هو الصحيح، لذلك أنا خلقت SqlConnection جديد يسمى به أسلوب (). ولكن لا بد لي من الانتظار وقتا طويلا قبل أن يعود عندما الجزء الخادم / DATA_SOURCE من سلسلة الاتصال خاطئ.

وحاولت مضيفا مهلة الاتصال إلى سلسلة الاتصال، فإنه لم ينجح. حاولت فتح الاتصال في موضوع آخر، ثم أدعو Thread.Abort () بعد عدة ثوان. عملت أيا منها.

فما هي الطريقة الصحيحة للقيام بذلك؟ شكرا.

هل كانت مفيدة؟

المحلول

وبعد البحث وجدت الحل ( HTTP: / /www.improve.dk/blog/2008/03/10/controlling-sqlconnection-timeouts )، I تعديله قليلا. إذا لم يكن هناك استثناء القيت، ثم سلسلة الاتصال غير صالحة.

        var alive = true;
        string error = null;
        var success = false;

        // ReSharper disable AccessToModifiedClosure
        // ReSharper disable UseObjectOrCollectionInitializer
        var thread = new Thread(() =>
                                    {
                                        try
                                        {
                                            var connection = new SqlConnection(connectionString);
                                            connection.Open();
                                            connection.Close();

                                            if (alive)
                                                success = true;
                                        }
                                        catch (SqlException ex)
                                        {
                                            if (alive)
                                                error = ex.Message;
                                        }
                                        catch (ThreadAbortException)
                                        {
                                        }
                                        finally
                                        {
                                            if (connection.State == ConnectionState.Open)
                                                connection.Close();
                                        }
                                    });
        // ReSharper restore AccessToModifiedClosure
        // ReSharper restore UseObjectOrCollectionInitializer
        thread.IsBackground = true;
        var sw = Stopwatch.StartNew();
        thread.Start();

        var timeout = TimeSpan.FromSeconds(3);
        while (sw.Elapsed < timeout)
            thread.Join(TimeSpan.FromMilliseconds(200));
        sw.Stop();

        if (!success)
        {
            alive = false;
            throw new Exception(error ?? "Connection timeout, please check the connection string.");
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top