在Azure表中创建表无一例外地失败

时间:2017-05-17 00:31:21

标签: c# azure-storage azure-table-storage

我正在尝试使用示例https://github.com/Azure-Samples/storage-table-dotnet-getting-started

在Windows Azure Table服务中创建一个表

在运行此示例时,我没有问题:表创建自己,插入和删除工作正常。

但是我作为代码复制到我的项目中似乎无法正常工作。表创建显然失败但不返回任何异常。这就像我的代码不等待表创建完成。

可以理解为什么吗?

感谢您的帮助!

以下是我如何调用代码:

public async void saveInAzureTable()
{
            AzureStorage azure = new AzureStorage();
            CloudTable table = await     AzureStorage.CreateTableAsync("randomtable123");
}

这是AzureStorage类:

    using System;
    using System.Threading.Tasks;
    using Microsoft.Azure;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.Wi`enter code here`ndowsAzure.Storage.Table;
    using Scraper.Models;

    namespace Scraper
    {
        public class AzureStorage
        {
            public async Task<TableResult> storeAdvertisementInAzure(CloudTable table, AdvertisementEntity entity)
        {
            TableOperation insertOrMergeOperation = TableOperation.InsertOrMerge(entity);
            TableResult result = await table.ExecuteAsync(insertOrMergeOperation);
            return result;
        }

        /// <summary>
        /// Validate the connection string information in app.config and throws an exception if it looks like 
        /// the user hasn't updated this to valid values. 
        /// </summary>
        /// <param name="storageConnectionString">Connection string for the storage service or the emulator</param>
        /// <returns>CloudStorageAccount object</returns>
        public static CloudStorageAccount CreateStorageAccountFromConnectionString(string storageConnectionString)
        {
            CloudStorageAccount storageAccount;
            try
            {
                storageAccount = CloudStorageAccount.Parse(storageConnectionString);
            }
            catch (FormatException)
            {
                Console.WriteLine("Invalid storage account information provided. Please confirm the AccountName and AccountKey are valid in the app.config file - then restart the application.");
                throw;
            }
            catch (ArgumentException)
            {
                Console.WriteLine("Invalid storage account information provided. Please confirm the AccountName and AccountKey are valid in the app.config file - then restart the sample.");
                Console.ReadLine();
                throw;
            }

            return storageAccount;
        }


        /// <summary>
        /// Create a table for the sample application to process messages in. 
        /// </summary>
        /// <returns>A CloudTable object</returns>
        public static async Task<CloudTable> CreateTableAsync(string tableName)
        {
            // Retrieve storage account information from connection string.
            CloudStorageAccount storageAccount = CreateStorageAccountFromConnectionString(CloudConfigurationManager.GetSetting("StorageConnectionString"));

            // Create a table client for interacting with the table service
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

            Console.WriteLine("Create a Table to store data from the scraper");

            // Create a table client for interacting with the table service 
            CloudTable table = tableClient.GetTableReference(tableName);
            try
            {
                if (await table.CreateIfNotExistsAsync())
                {
                    Console.WriteLine("Created Table named: {0}", tableName);
                }
                else
                {
                    Console.WriteLine("Table {0} already exists", tableName);
                }
            }
            catch (StorageException)
            {
                Console.WriteLine("If you are running with the default configuration please make sure you have started the storage emulator. Press the Windows key and type Azure Storage to select and run it from the list of applications - then restart the sample.");
                Console.ReadLine();
                throw;
            }

            Console.WriteLine();
            return table;
        }

    }
}

2 个答案:

答案 0 :(得分:2)

根据您的代码和说明,我猜您的代码无法创建表的原因与您的异步saveInAzureTable有关。

我猜你在console main方法或其他方法中调用这个方法。

如果主要方法完全执行,则异步方法saveInAzureTable不会执行创建表格代码。它将结束所有异步方法。所以它可能不会毫无例外地创建表。

我建议你可以使用Task关键字而不是void。然后你可以使用等待关键字来等待方法执行得好。

 public static async Task saveInAzureTable()
        {
            AzureStorage azure = new AzureStorage();
            CloudTable table = await AzureStorage.CreateTableAsync("aaaaaa");
        }

调用此方法:

   saveInAzureTable().Wait();

答案 1 :(得分:0)

我真的希望我能评论,但我还没有足够的分数。

我相信异步调用可能会吞下您的错误消息。

将其更改为同步通话,然后尝试