2017-02-13 10 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"]) 
        } 
       }); 
      } 
     } 
    } 
} 

내가 성공적으로 직접 실행 창에서 개체를 인스턴스화 할 수 있습니다,하지만 난 그 인스턴스에서, 그 부하() 메서드를 호출 할 때, 내가 얻을 :

첫 번째에게 다음 코드 블록이다 mscorlib.dll에서 'System.Threading.ThreadAbortException'유형의 예외 예외가 발생했습니다.

평가하려면 스레드를 일시적으로 실행해야합니다. 조사 식 창을 사용하여 평가를 수행하십시오.

옵션 -> 디버그 -> 속성 평가 및 다른 암시 적 함수 호출 사용을 해제했습니다.

나를 혼란스럽게 만들었습니다 ... 아주 간단하게 보입니다. 나는 완전히 지나칠 수 없습니다.

+0

직접 실행 창에서이 작업을 수행하려는 이유를 알 수 있습니까? – CodingYoshi

+0

오류를 해결하려고하십니까? 또는 JSON 내용이 제대로로드되고 있는지 확인 하시겠습니까? –

+0

즉각적인 창에서 실행하고자하는 이유는 코드가 한 번 사용되기 때문입니다. 즉, 새 데이터베이스를 설정할 때 일부 작업을 초기화하는 데에만 사용됩니다. 그래서 나는 다른 어느 곳에서도 그것을 부를 수있는 시설을 갖추고 있지 않다. 내 말은, 나는 콘솔 앱을 설치할 수 있다는 뜻이다. 그것을 목표로 삼는 것, 나는 생각한다. 그러나 그것을 피하려고 노력하고 있었다. 그리고 그것을 테스트 할 때 나는 그것을 많이 실행해야하기 때문에 직접적인 창에서 그렇게하는 것이 가장 쉽습니다. –

답변

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

그래서 나는이 응답을 upvote했지만 "대답"이 아니므로 나는 그것을 그와 같이 표시하지 않을 것입니다. 나는 해결책과 함께 내 자신의 응답을 올릴 것이다. –

+0

문제가 발견되어 기쁩니다. – CodingYoshi