Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 停止对事件执行方法_.net_Events_.net 1.1 - Fatal编程技术网

.net 停止对事件执行方法

.net 停止对事件执行方法,.net,events,.net-1.1,.net,Events,.net 1.1,我在一个类中有一个属性,当设置该属性时,它将更改一些其他属性的值,其中任何属性都可能引发特定的回滚事件(例如RollbackEvent)。如果触发此类事件,则原始属性所做的所有更改都已回滚,现在我需要该属性停止运行 抛出异常不是一个选项(我认为),因为会有另一个程序集使用代码(实际上是另一个程序集,它捕获了我代码中的第二个事件,如果它无法处理这种情况,它会命令我的代码回滚,而回滚事件就是在这个时候触发的),因此不应该为其抛出异常 更新 这是我的代码的概要,第二个程序集中的代码永远不会意识到第一个

我在一个类中有一个属性,当设置该属性时,它将更改一些其他属性的值,其中任何属性都可能引发特定的回滚事件(例如
RollbackEvent
)。如果触发此类事件,则原始属性所做的所有更改都已回滚,现在我需要该属性停止运行

抛出异常不是一个选项(我认为),因为会有另一个程序集使用代码(实际上是另一个程序集,它捕获了我代码中的第二个事件,如果它无法处理这种情况,它会命令我的代码回滚,而回滚事件就是在这个时候触发的),因此不应该为其抛出异常

更新 这是我的代码的概要,第二个程序集中的代码永远不会意识到第一个程序集中抛出了异常,但是在“事务”成功回滚(显然)后,第二个程序集中的代码停止执行

组件1

public class Someclass
{
    public String SomeField
    {
        get { return this._someField; }
        set 
        {
            try 
            {
                this.BackupSomeFields();
                this._someField = value;
                //Some other Properties are changed
                //One of which may (and will for the purposes of the question) throw a DocumentRolledbackException exception
            }
            catch (DocumentRolledbackException ex)
            {
                return;
            }
        }
    }

    public String SomeOtherField
    {
        get { return this._someOtherField; }
        set 
        {
            this._someOtherField = value;
            //Raise AN event (handled in Assembly 2)
        }
    }


    public void RollbackProcessTransaction()
    {
        //Rollback changes with the backup created by the SomeField property

        //Raise THE event
        DocumentRolledBack(this, new EventArgs());
    }


    private void MyBase_DocumentRolledBack(Object sender, EventArgs e)
    {
        //This method is called when the DocumentRolledBack event is fired in the RollbackProcessTransaction method.
        throw new DocumentRolledbackException(this);
    }

}
组件2

public class SomeOtherClass
{
    private SomeClass obj;

    private HandleANEvent()
    {
        obj.RollbackProcessTransaction();
        //Code in this line on never gets executed! >.<
    }
}
public类SomeOtherClass
{
私有类obj;
私有事件()
{
obj.RollbackProcessTransaction();
//上此行中的代码永远不会执行!><
}
}
基本上一切都正常,当异常在程序集1中抛出时,它会被属性捕获,然后这样的属性返回,但是调用
obj.RollbackProcessTransaction()后的代码会返回永远不会执行。。。为什么?

p.S.我在编辑器中编写了所有这些代码,因为我实际上是用VB编程的,所以不要把所有代码都按字面意思写在那里,这只是为了让你明白它的意思。

像这样

public class Test
{               
    public object Foo1 
    {
        try
        {           
           Foo2 = 1;
           Foo3 = 2;
           Foo4 = 3;
        }
        catch (RollbackException ex) { }
    }

    private void DoRollback()
    {
       throw new RollbackException();
    }

    public object Foo2 { get; set; }
    public object Foo3 { get; set; }
    public object Foo4 { get; set; }

    private class RollbackException : Exception
    {
    }
}
编辑:


最简单的方法是在更改每个属性之前记录它的值,然后在发生错误时还原它们。如果每个属性都有一个快速退出(如果该值设置相同),则将防止引发更多异常。我从马格纳斯的回答中借用了一点

public class Test
{
    public object Foo1
    {
        object oldfoo2 = Foo2;
        object oldfoo3 = Foo3;
        object oldfoo4 = Foo4;
        try
        {
            Foo2 = 1;
            Foo3 = 2;
            Foo4 = 3;
        }
        catch (RollbackException ex) {
            Foo4 = oldfoo4;
            Foo3 = oldfoo3;
            Foo2 = oldfoo2;
        }
    }

    public object Foo2 {
        get {
            return foo2;
        }
        set {
            if (value == foo2) return;
            if (isInvalid(value)) throw new RollbackException();
            foo2 = value;
        }
    }
    private object foo2 = null;

    public object Foo3 { /* As Foo2 */ }
    public object Foo4 { /* As Foo2 */ }

    private class RollbackException : Exception
    {
    }
}

你说的“我需要那家酒店停下来”是什么意思?您想进一步将该属性的值设置为“不做任何事情”吗?设置此属性时,它会将一些其他属性(例如4个其他属性)设置为其他值。例如,如果要设置的第二个属性引发事件,其本身和第一个属性都已回滚,并且不应设置其他属性,则该属性现在应该退出,基本上,它是一个动态的
退出属性
实际上就是这样,这就是我认为我可以做的,但我真的不喜欢这个ifs数组。。。我在想,一定有一种方法可以使用纯事件。Jajaja,在发布之后,我一直在思考解决方案,并提出了完全相同的代码,我只是编译来测试它,让我们看看它是如何运行的:)不使用事件如何,只是异常。因为异常将被消费程序集
assembly 2
捕获,这正是我试图避免的,但我的代码仍将其抛出到程序集2。只需跳过事件并在内部处理事务回滚
public class Test
{
    public object Foo1
    {
        object oldfoo2 = Foo2;
        object oldfoo3 = Foo3;
        object oldfoo4 = Foo4;
        try
        {
            Foo2 = 1;
            Foo3 = 2;
            Foo4 = 3;
        }
        catch (RollbackException ex) {
            Foo4 = oldfoo4;
            Foo3 = oldfoo3;
            Foo2 = oldfoo2;
        }
    }

    public object Foo2 {
        get {
            return foo2;
        }
        set {
            if (value == foo2) return;
            if (isInvalid(value)) throw new RollbackException();
            foo2 = value;
        }
    }
    private object foo2 = null;

    public object Foo3 { /* As Foo2 */ }
    public object Foo4 { /* As Foo2 */ }

    private class RollbackException : Exception
    {
    }
}