2017-02-13 3 views
2

Я пытаюсь запустить довольно простой код в непосредственном окне Visual Studio. Весь код выполняет чтение некоторого ввода JSON из файла и использует его для вызова некоторых других методов для загрузки базы данных со значениями. Вот код блока:Вызов метода C# VS в непосредственном окне, Получение 'System.Threading.ThreadAbortException'

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"]) 
        } 
       }); 
      } 
     } 
    } 
} 

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

Первый случайное исключение типа «System.Threading.ThreadAbortException» произошло в mscorlib.dll

Для оценки требуется, чтобы поток выполнялся временно. Используйте окно «Смотреть», чтобы выполнить оценку.

У меня есть alraedy отключен Опции -> Debug -> Включить оценку свойств и другие неявные вызовы функций.

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

+0

Могу ли я узнать, почему вы хотите сделать это в ближайшем окне? – CodingYoshi

+0

Вы пытаетесь устранить ошибку? или убедитесь, что содержимое JSON загружено правильно? –

+0

Итак, причина, по которой вы хотите запустить в непосредственном окне, состоит в том, что код является одноразовым. I.e., он используется только для инициализации некоторых вещей при настройке новой базы данных. Поэтому у меня нет средств настройки для вызова его из другого места. Я имею в виду, я мог бы настроить консольное приложение. намереваться на нее, я полагаю, но просто пытался избежать этого. И при тестировании мне нужно много запускать, поэтому проще всего сделать это в ближайшем окне. –

ответ

0

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

3

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

System.Diagnostics.Debugger.NotifyOfCrossThreadDependency()

Почему код есть что?

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

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

Нажатие на эту иконку заставит оценки продолжать, , которые, скорее всего, даст вам результат вы были после:
enter image description here

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

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

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

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

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

Для получения более подробной информации, пожалуйста, прочтите статью this.

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

+0

Итак, я поднял этот ответ, но это не «ответ», поэтому я не отмечаю его как таковой. Я отправлю свой собственный ответ с помощью решения, как того требует. –

+0

Рад, что вы нашли проблему. – CodingYoshi