Вызов метода С# VS в непосредственном окне, получение «System.Threading.ThreadAbortException»

Я пытаюсь запустить довольно простой код в непосредственном окне Visual Studio. Все, что делает код, это считывает некоторый ввод JSON из файла и использует его для вызова некоторых других методов для загрузки базы данных со значениями. Вот блок кода:

using Newtonsoft.Json.Linq;
using System;
using System.IO;

namespace POST.API
{
    public class Initialization
    {
        public const string JSON_DATA_FILE = "C:\\OHA_SDD_POST_Development\\POST\\POST.API\\Services\\Setup\\InitializationData.json";
        public const string JSON_OBJKEY_DOMAIN = "Domain";
        public const string JSON_OBJKEY_ACCOUNTDOMAINTYPE = "AccountDomainType";
        public const string JSON_OBJKEY_ORGLOCTYPE = "OrganizationLocationType";

        public JObject POSTDataInitJObject;

        public JArray Domains;
        public JArray AccountDomainRoles;
        public JArray OrganizationLocationTypes;

        public API.Services.Domain SvcDomain;
        public API.Services.Organization SvcOrganization;
        public API.Services.Location SvcLocation;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="JsonDataFile"></param>
        public Initialization(string JsonDataFile = JSON_DATA_FILE)
        {
            string JsonData = File.ReadAllText(JsonDataFile);
            POSTDataInitJObject = JObject.Parse(JsonData);

            Domains = (JArray)POSTDataInitJObject[JSON_OBJKEY_DOMAIN];
            AccountDomainRoles = (JArray)POSTDataInitJObject[JSON_OBJKEY_ACCOUNTDOMAINTYPE];
            OrganizationLocationTypes = (JArray)POSTDataInitJObject[JSON_OBJKEY_ORGLOCTYPE];
        }
        /// <summary>
        /// 
        /// </summary>
        public void Load()
        {
            LoadDomains();
            LoadOrganizationLocationTypes();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="Replace"></param>
        public void LoadDomains(bool Replace = true)
        {
            SvcDomain = new API.Services.Domain();

            if (Replace)
            {
                SvcDomain.ClearAllDomains(true);
            }

            foreach (var i in Domains)
            {
                SvcDomain.AddDomain(new API.Models.Domain
                {
                    Code = (string)i["Code"],
                    Definition = new API.Models.TypeDefinition
                    {
                        Name = (string)i["Name"],
                        Description = (string)i["Description"],
                        Order = Int32.Parse((string)i["Order"])
                    }
                });
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="Replace"></param>
        public void LoadOrganizationLocationTypes(bool Replace = true)
        {
            SvcLocation = new API.Services.Location();

            if (Replace)
            {
                SvcLocation.ClearAllOrganizationLocationTypes();
            }

            foreach (var i in OrganizationLocationTypes)
            {
                SvcLocation.AddOrganizationLocationType(new API.Models.OrganizationLocationType
                {
                    Definition = new API.Models.TypeDefinition
                    {
                        Name = (string)i["Name"],
                        Description = (string)i["Description"],
                        Order = Int32.Parse((string)i["Order"])
                    }
                });
            }
        }
    }
}

Я могу успешно создать экземпляр объекта в непосредственном окне, но когда я затем попытаюсь вызвать этот метод Load() для этого экземпляра, я получаю:

Первое исключение типа System.Threading.ThreadAbortException в mscorlib.dll

Для оценки требуется временное выполнение потока. Используйте окно просмотра для выполнения оценки.

Я уже отключил Параметры -> Отладка -> Включить оценку свойств и другие неявные вызовы функций.

Поставил меня в тупик ... Кажется, это очень просто, и я совершенно не могу пройти мимо этого.


person Michael Doleman    schedule 13.02.2017    source источник
comment
Могу я узнать, почему вы хотите сделать это в ближайшем окне?   -  person CodingYoshi    schedule 14.02.2017
comment
вы пытаетесь устранить ошибку? или убедитесь, что содержимое JSON загружается правильно?   -  person Eric Walter    schedule 14.02.2017
comment
Таким образом, причина желания запуска в немедленном окне заключается в том, что код предназначен для одноразового использования. То есть он используется только для инициализации некоторых вещей при настройке новой базы данных. Поэтому у меня нет возможности звонить из любого другого места. Я имею в виду, я мог бы настроить консольное приложение. чтобы нацелиться на это, я полагаю, но просто пытался избежать этого. И при тестировании мне нужно много запускать его, поэтому проще всего сделать это из непосредственного окна.   -  person Michael Doleman    schedule 14.02.2017


Ответы (2)


Вы прямо или косвенно вызываете некоторый код, в котором есть это:

System.Diagnostics.Debugger.NotifyOfCrossThreadDependency()

Зачем это в коде?

Некоторые из вас могли столкнуться с такой ситуацией, когда вы пытаетесь оценить свойство или метод во время отладки и получаете это сообщение в ячейке значения часов:
введите здесь описание изображения

Существует быстрое «обходное решение» этой проблемы. Если вы посмотрите внимательно, то увидите небольшой круглый значок после сообщения: введите здесь описание изображения

Нажатие на этот значок приведет к продолжению оценки, что, скорее всего, даст вам результат, который вы хотели получить:
введите здесь описание изображения

Когда мы ломаем отладчик и пытаемся оценить свойство, требующее запуска кода, мы можем запустить код только в текущем потоке. Все остальные потоки замораживаются, чтобы свести к минимуму влияние на состояние системы… Но что, если для завершения оценки моей собственности требуется запуск другого потока? Например, если я делаю удаленный вызов, мне, скорее всего, понадобятся потоки ThreadPool для этого… Но все остальные потоки заморожены… что приведет к «тупику». У отладчика есть защита от этого, которая дает коду оценки максимум 5 секунд для запуска. Если код не закончил выполняться в течение установленного времени, например, когда мы заблокированы из-за зависшего потока, часы будут «зависать» на 5 секунд, и после этого оценка будет прервана. Мы получим это сообщение, уведомляющее нас о проблеме: введите здесь описание изображения

Итак, эта строка кода вызывает сообщение, которое вы получаете:

Отладчик не разрешит это автоматически, чтобы избежать изменения состояния, а вместо этого выдаст пользователю сообщение «Оценка функции требует запуска всех потоков».

Если у вас открыт отладчик, то:

Если пользователь решает разрешить выполнение всех потоков, он может нажать значок рядом с сообщением, что заставит отладчик запустить код свойства во второй раз, на этот раз со всеми запущенными потоками и без прерывания метода NotifyOfCrossThreadDependency. .

Прочтите эту статью, чтобы узнать подробности.

Кроме того, я не уверен, по какой причине вы запускаете весь этот код в ближайшем окне. Возможно, вы можете написать небольшое консольное приложение и вместо этого запустить приложение.

person CodingYoshi    schedule 13.02.2017
comment
Итак, я проголосовал за этот ответ, но это не ответ, поэтому я не отмечаю его как таковой. Я опубликую свой собственный ответ с решением, которое искали. - person Michael Doleman; 14.02.2017
comment
Рад, что вы нашли проблему. - person CodingYoshi; 15.02.2017

Так что, похоже, проблема была случайной. Я просто не дал ссылку в проекте, из которого пытался запустить код, на EntityFramework. Не уверен, почему он выдал такую ​​​​ошибку, но это то, что произошло. Мне это кажется странным, но я возьму это. Теперь это работает.

person Michael Doleman    schedule 14.02.2017