.Net中的托管和非托管资源

时间:2016-07-28 11:47:01

标签: .net garbage-collection resources dispose

我对.net编程中的托管和非托管资源感到困惑。我正在开发一个vb.net应用程序。我在微软网站上看到,如果我们使用托管资源,垃圾收集器将处理它,如果我们使用非托管资源,我们需要调用dispose。但我无法在任何地方得到以下问题的答案。

  1. 如何将代码使用的资源区分为“托管”和“非托管”?我可以拥有属于托管和非托管资源的资源列表吗?
  2. 在创建对象之前还是在创建对象之后是使用/分配资源?
  3. 如果是非托管资源,一旦范围关闭,资源是否会被处置,或者我是否应该在范围结束后处置资源?

2 个答案:

答案 0 :(得分:1)

  1. 如果类继承IDisposable其非托管或包含一些非托管
  2. 不确定你的意思,通常是在CTOR,所以随着对象的创造,它不能在之前,你认为CTOR是否在之后? (o.c.除非另有说明)
  3. 最佳做法是在您使用某些托管代码的任何地方继承IDisposable,但.net具有良好的GC,除非您以某种方式锁定非托管res。你应该没事。

答案 1 :(得分:0)

Install-Package Microsoft.Azure.Management.ResourceManager.Fluent

         var credentials = SdkContext.AzureCredentialsFactory
                    .FromServicePrincipal(clientId, clientSecret, tenantId, 
         AzureEnvironment.AzureGlobalCloud);

         var azure = Azure
                .Configure()
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                .Authenticate(credentials)
                .WithSubscription(subscriptionID);
         List<IStorageAccount> storageAccounts = 
         azure.StorageAccounts.List().ToList();
            foreach (IStorageAccount storageaccount in storageAccounts)
            {
                var exportSecrets = true;
                CloudStorageAccount storageAccountss = new CloudStorageAccount(
                    new StorageCredentials(storageaccount.Name, 
                      storageaccount.GetKeys().FirstOrDefault().Value), true);
                var connString = storageAccountss.ToString(exportSecrets);
                var storageAccount = CloudStorageAccount.Parse(connString);
                CloudBlobClient myClient = storageAccount.CreateCloudBlobClient();
                ContainerResultSegment resultSegment = null;
                BlobContinuationToken continuationToken = null;
                resultSegment = myClient.ListContainersSegmented("", 
                  ContainerListingDetails.Metadata, 5, continuationToken, null, 
                  null);                   
                // Enumerate the containers returned.
                foreach (var container in resultSegment.Results)
                {
                    var containers = myClient.GetContainerReference(container.Name);
                    foreach (IListBlobItem item in container.ListBlobs(null, false, 
                     BlobListingDetails.None))
                    {
                        if (item.GetType() == typeof(CloudPageBlob))
                        {
                            CloudPageBlob pageBlob = (CloudPageBlob)item;
                            if (pageBlob.Name.Contains(".vhd"))
                            {
                                // 0. Unspecified  1. Locked 2. UnLocked 
                                if (Convert.ToInt32(pageBlob.Properties.LeaseStatus) 
                                 == 2)
                                {
                                    list.Add(new Disks { Name = 
                                      pageBlob.Name.ToString(), URI = 
                                            pageBlob.Uri.AbsoluteUri.ToString(), 
                                      ContainerName = container.Name.ToString() });
                                }
                            }
                        }

                    }
                }

            }
            Helper helper = new Helper();
            StringBuilder sb = new StringBuilder();
            DataTable dt = helper.GetData(list);
            foreach (DataRow dr in dt.Rows)
            {
                foreach (DataColumn dc in dt.Columns)
                    sb.Append(FormatCSV(dr[dc.ColumnName].ToString()) + ",");
                sb.Remove(sb.Length - 1, 1);
                sb.AppendLine();
            }
            File.WriteAllText("D:\\UnmanagedDisks.csv", sb.ToString());