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

我可以成功实例化对象在立即窗口,但是当我再尝试调用Load()方法,在该情况下,我得到:

第一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

所以,我确实收到了这个答复,但它不是“答案”,所以我不会将其标记为这样。我将按照所寻求的方式发布自己的答案和解决方案。 –

+0

很高兴你发现了这个问题。 – CodingYoshi