通过RunAsync自动使Service Fabric Reliable Dictionary对象失效

时间:2016-12-28 23:06:41

标签: c# azure-service-fabric service-fabric-stateful

我试图向过期的可靠字典对象添加自动删除,看起来我必须按照以下方式实现自己的方式:https://stackoverflow.com/a/36466890/7293543

我的方法是使用" RunAsync"任务并让它不断运行while循环。它在前几次工作,但是一旦我在字典中添加了一些对象,我就会收到一个奇怪的错误。这是一种愚蠢的做法吗?其他人如何自动清除可靠的字典对象?

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();
        await deleteExpired("MyDictionaryName", cancellationToken);
    }
}

private async Task deleteExpired(string dictionaryName, CancellationToken cancellationToken)
{
    var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, CacheObject>>(dictionaryName);
    Dictionary<string, CacheObject> ret = new Dictionary<string, CacheObject>();

    using (var tx = StateManager.CreateTransaction())
    {
        var count = myDictionary.GetCountAsync(tx);

        if (count.Result > 0)
        {
            IAsyncEnumerator<KeyValuePair<string, CacheObject>> e = (await myDictionary.CreateEnumerableAsync(tx)).GetAsyncEnumerator();

            while (await e.MoveNextAsync(cancellationToken))
            {
                if (e.Current.Value.expiration <= DateTime.Now)
                {
                    await myDictionary.TryRemoveAsync(tx, e.Current.Key);
                    await tx.CommitAsync();
                    ServiceEventSource.Current.ServiceMessage(this.Context, String.Format("Object deleted at {0} - key: {1} expired at {2}", DateTime.Now.ToString(), e.Current.Key, e.Current.Value.expiration.ToString()));
                }
            }
        }
    }
}

错误: 错误发生在&#34;而(true)&#34;在我将一些可靠的字典对象添加到我的字典中之后。

托管调试助手&#39; FatalExecutionEngineError&#39;已在C:\ SfDevCluster \ Data_App_Node_2 \ CacheApplicationType_App339 \ CachePkg.Code.1.0.0 \ Cache.exe&#39;中检测到问题。

其他信息:运行时遇到致命错误。错误的地址是0x8c46ed90,在线程0x1980上。错误代码是0x80131623。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。

1 个答案:

答案 0 :(得分:2)

如果Reliable Dictionary包含多个准备过期的项目,则上述代码在终止后继续使用该事务(在上述情况下提交)。这会导致枚举中的断言,因为它在绑定的事务终止后被使用。

我会将Reliable Collections中的建议更新为

  • 在用于创建的事务终止(已提交/已中止)或已处置之后,请勿使用枚举。