簡體   English   中英

在立即 Window 中調用 C# 方法 VS,得到 'System.Threading.ThreadAbortException'

[英]Calling C# Method VS in Immediate Window, Getting 'System.Threading.ThreadAbortException'

我試圖在 Visual Studio 即時 window 中運行一些相當簡單的代碼。 代碼所做的只是從文件中讀取一些 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"])
                    }
                });
            }
        }
    }
}

我可以在立即 window 中成功實例化 object,但是當我嘗試調用該 Load() 方法時,在該實例上,我得到:

在 mscorlib.dll 中發生了“System.Threading.ThreadAbortException”類型的第一次機會異常

評估需要一個線程臨時運行。 使用 Watch window 執行評估。

我已經關閉了 Options -> Debug -> Enable property evaluation 和其他隱式 function 調用。

讓我難住了......看起來超級簡單,我完全無法克服它。

您正在直接或間接調用其中包含以下代碼的某些代碼:

System.Diagnostics.Debugger.NotifyOfCrossThreadDependency()

為什么代碼會有這個?

可能有些人遇到了這種情況,您嘗試在調試時評估屬性或方法,並在手表的值單元格中獲得此消息:
在此處輸入圖片說明

此問題有一個快速的“解決方法”。 如果仔細查看,則會在消息后看到一個小圓形圖標: 在此處輸入圖片說明

按下此圖標將迫使評估繼續,這很可能會給您帶來您想要的結果:
在此處輸入圖片說明

當我們中斷調試器並嘗試評估需要運行代碼的屬性時,我們只能在當前線程中運行代碼。 所有其他線程都被凍結以最大程度地減少對系統狀態的影響……但是,如果我的媒體資源需要運行另一個線程來完成評估,該怎么辦? 例如,如果我正在進行遠程調用,則很可能需要ThreadPool線程……但是所有其他線程都被凍結了……這將導致“死鎖”。 調試器對此采取了保護措施,該保護措施使評估代碼最多可以運行5秒鍾。 如果代碼未在規定的時間內完成運行,例如,當我們由於線程凍結而被阻塞時,手表將被“掛起” 5秒鍾,然后評估將終止。 我們將收到此消息以通知我們該問題: 在此處輸入圖片說明

因此,該行代碼會導致您收到以下消息:

調試器將不會自動允許它,以避免狀態更改,而是將向用戶顯示“函數評估要求所有線程都運行”消息。

如果打開調試器,則:

如果用戶認為可以讓所有線程運行,可以在消息旁邊按下圖標,這將使調試器第二次運行屬性代碼,這是所有線程都在運行,並且不會在NotifyOfCrossThreadDependency方法上中止。

請閱讀文章了解更多詳情。

另外,我不確定您的理由是要在立即窗口中運行所有這些代碼。 也許您可以編寫一個小型控制台應用程序並運行該應用程序。

因此,問題似乎是偶然的。 我只是未能在試圖運行代碼的項目中提供對EntityFramework的引用。 不知道為什么它會引發如給定的錯誤,但事實就是如此。 對我來說似乎很奇怪,但我接受。 現在可以使用了。

一般評論:評估代碼非常需要立即的 window。 不是簡單的應用程序,而是需要您的應用程序,例如進入網站並使用 Selenium 評估對象。 為我們一直能夠使用的解決方法創建一個控制台應用程序將是耗時的,但並非不可能,即使用立即 window 評估對象。 我會在 window state 上冒險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM