这是等待设置属性的正确异步方法吗?

时间:2016-08-02 14:18:39

标签: c# async-await

我有一个由后台操作设置的类属性。这是我读取该属性值的方法。这个想法是在返回null之前等待一段合理的时间,因为这意味着仍有工作要完成

public async Task<Entity> GetEntityAsync()
{
    int tries = 0;
    while (_entity == null && tries < 2)
    {
        await Task.Delay(100);
        tries++;
    }

    return _entity;
}

然后我像这样使用它

var entity = await entityManager.GetEntityAsync();

这种做法是否正确或有更好的选择?

修改

设置_entity的后台操作是第三方组件,它通过数据可用的事件进行报告。我想将事件方法转换为async / await方法。原因是

  • 这种方法在很多地方使用(我正在进行重构),而且它没有为面向事件的方法做好准备。
  • 面向事件的方法实施起来更复杂。我只是想确保我不会挂掉主线程,99%的时候,_entity在第一次拍摄时会有一个不同的值。

3 个答案:

答案 0 :(得分:0)

你的方法不可靠。

您应该等待Charge - Amount paid in方法中的entityManager.GetEntityAsync()方法:

GetEntityAsync()

答案 1 :(得分:0)

定义你的_entity,如:

TaskCompletionSource<Entity> _entity =  _new TaskCompletionSource<Entity>();

并在第3天像这样设置。派对活动:

_entity.TrySetResult(xxxx);

然后像这样使用它:

public async Task<Entity> GetEntityAsync()
{
    Entity result = await _entity.Task;
    _entity = _new TaskCompletionSource<Entity>();
    return result;
}

答案 2 :(得分:0)

您说您的数据源使用事件来返回<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>。事件很容易连接到_entity。考虑:

TaskCompletionSource

现在你有一个很好的小异步方法连接到你的数据源事件。

当然,这只是一个非常简单的例子,可以做出很多假设,没有错误处理等等,但它应该会让你找到一个好的解决方案。如果您有事件,则无需轮询:)