繁体   English   中英

C#中的软件交易

[英]software transactions in c#

我有一些C#代码需要像这样工作

D d = new D();
foreach(C item in list)
{
    c.value++;
    d.Add(c);   // c.value must be incremented at this point
}
if(!d.Process())
    foreach(C item in list)
        c.value--;

它增加列表中每个项目的值,然后尝试对它们进行一些处理。 如果处理失败,则需要屏蔽突变或项目。

问题是: 是否有更好的方法可以做到这一点? 我对此不喜欢的事情是,我可能会发现它出了问题的方法。 例如,如果发生任何事情,它就会失去同步。

一个想法(似乎比问题还糟)是:

D d = new D();
var done = new List<C>();
try
{
    foreach(C item in list)
    {
        c.value++;
        done.Add(c);
        d.Add(c);
    }
    if(d.Process()) done.Clear();
}
finaly
{
    foreach(C c in done)
        c.value--;
}

在不了解您的应用程序的全部细节的情况下,我认为不可能为您提供针对该问题的具体解决方案。 基本上,没有一种方法可以始终在您需要这种情况的100%的情况下工作。

但是,如果您控制着D类,并且知道D.Process()将会失败的情况,则您可以执行以下两项操作之一,这将在概念上D.Process()此操作。

一种方法是在调用Process方法之前,通过实现CanProcess函数之类的东西来测试D的状态,该函数在且仅当Process会返回true时才返回true,但实际上并未进行任何处理。

另一种方法是创建一个临时的D对象,该对象实际上并未提交,但在其内容上运行Process方法。 然后,如果Process成功,您可以在其上调用某种PromoteCommit方法来完成更改。 与拥有Dataset对象类似,可以创建它的克隆,在克隆中进行事务处理,然后仅在处理成功时才将其合并回主数据集中。

它占用大量内存,但是您可以在递增之前复制列表。 如果该过程成功,则可以返回新列表。 如果失败,则返回原始列表。

为什么不仅在过程成功时才增加?

我认为更好的方法是使D中的处理方法增加内部的c.value。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM