【问题标题】:Azure Table Storage - CreateTableIfNotExists hanging - was previously workingAzure 表存储 - CreateTableIfNotExists 挂起 - 以前工作
【发布时间】:2016-04-27 16:43:42
【问题描述】:

我一直在努力让一些代码在新机器上工作。我以为我终于让它工作了,但现在当我运行它时,代码在尝试创建表存储时挂起(或者实际上是对它的引用,因为它确实已经存在)...我知道必须确保它一直是异步的,并且这段代码正在工作......我现在已经对其进行了更改以尝试改进它并使其正常工作在这台机器上,但有些不对劲......所以在回购的构造函数中我这样做......

public LdsRepo() 
    {

        if (!GetTableRef("licensedatesummary").Result)
        {
            throw new Exception("It broke!");
        }
    }

而我的 GetTableReference 方法(在基类上)是这样的......

protected async Task<bool>  GetTableRef(string tableRef)
    {
        try
        {
            if (string.IsNullOrEmpty(StorageAccountName) || string.IsNullOrEmpty(AuthKey))
            {
                throw new ArgumentNullException(nameof(tableRef),
                    "storageaccountname or authk are not set in the config");
            }
            if (_tableClient == null)
                _tableClient =
                    new CloudStorageAccount(new StorageCredentials(StorageAccountName, AuthKey), true)
                        .CreateCloudTableClient();
            if (_table == null)
            {
                // Create the CloudTable object that represents the referenced table.
                _table = _tableClient.GetTableReference(tableRef);
                var x =  _table.CreateIfNotExistsAsync();
                return await x;
            }
            return true;
        }
        catch (Exception ex)
        {
            Trace.WriteLine(ex.Message);
            Trace.WriteLine(ex.ToString());
            return false;
        }
    }

如果有帮助...这是我的包配置...

<packages>
<package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net452" />
<package id="Microsoft.Data.Edm" version="5.7.0" targetFramework="net452" />
<package id="Microsoft.Data.OData" version="5.7.0" targetFramework="net452" />
<package id="Microsoft.Data.Services.Client" version="5.7.0" targetFramework="net452" />
<package id="Microsoft.Web.WebJobs.Publish" version="1.0.11" targetFramework="net452" />
<package id="Microsoft.WindowsAzure.ConfigurationManager" version="3.2.1" targetFramework="net452" />
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net452" />
<package id="System.Spatial" version="5.7.0" targetFramework="net452" />
<package id="WindowsAzure.Storage" version="7.0.0" targetFramework="net452" /> </packages>

最后是我实际的 WebApi 控制器....

[EnableCors(origins: "*", headers: "*", methods: "*")]
[RoutePrefix("api")]
public class LinkDataController : ApiController
{
    private readonly IFloatingObjectRecordRepo _repo;
    public LinkDataController()
    {
        _repo = new FloatingObjectRecordRepo();
    }
    [HttpGet, Route("linkdata/{id}")]
    public async Task<IHttpActionResult> Get(string id)
    {
        try
        {
            if (string.IsNullOrEmpty(id))
            {
                return BadRequest();
            }
            var retStr = await  _repo.SearchById(id);
            if (retStr == "Not found")
                return new IsoncOkResult<KeyValuePair<string, string>>(
                    new KeyValuePair<string, string>(id, retStr), this);
            var g = Guid.NewGuid();
            var f = await _repo.Add(new FlorData
            {
                CreatedBy = "Ais Integration Search",
                Mmsi = id,
                CreatedOn = DateTime.Now,
                GeneratedId = g,
                RowKey = g.ToString()
            });
            retStr = f.GeneratedId.ToString();
            return new IsoncOkResult<KeyValuePair<string, string>>(new KeyValuePair<string, string>(id, retStr), this);
        }
        catch (Exception ex)
        {
            Trace.TraceError($"Error Searching / Creating AIS Link Data: {ex}");
            return BadRequest(ex.ToString());
        }
    }
   }

我在这里进行了相当广泛的搜索,但每次都是有人没有一直遵循异步链的地方,我认为我正在这样做?

【问题讨论】:

    标签: azure asp.net-web-api azure-storage


    【解决方案1】:

    使用时

    if (!GetTableRef("licensedatesummary").Result)
    

    您错过了“一路异步”的要点,请参阅This question 了解 await Task 和 Task.Result 之间的区别。

    有几个选项可以解决这个问题,这里只有两个:

    1. 您可以通过使用 CreateIfNotExists( ) 方法而不是 CreateIfNotExistsAsync()。
    2. 请参阅 How to call async method in constructor,其中解释了此类场景的一些技术

    【讨论】:

    • 谢谢,是的,你绝对必须同步,因为在你真正引用或创建表之前你不能做任何其他事情,因此这不应该完全不同步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多