.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
{
}
}