【问题标题】:Can you abort a set procedure of a property你能中止一个属性的设置过程吗
【发布时间】:2010-02-17 16:14:01
【问题描述】:

我正在使用 C#.NET 进行编程。是否可以在不抛出异常的情况下中止类属性的设置过程?

这就是我想做的……

public int RandomProperty
{
    set
    {
     DialogResult answer = new DialogResult();
     answer = MessageBox.Show("This process could take up to 5 min. Are you sure you want to continue?");
     if(answer = DialogResult.No) 
        CancelSet   // Can I do something similar here?
     else
     {
      ...Do set procedure
     }
    }
}

我认为我不能使用方法(而不是属性),因为我正在使用 propertygrid 设置此值。

【问题讨论】:

  • 您可能需要考虑将此作为方法而不是属性,例如 SetRandomProperty(int)。通常预计二传手会非常快。
  • 你可以随时return;,但实际上,set 函数不应该长时间运行,不应该需要用户输入(毕竟它已经有值),并且不应该抛出异常.你真的应该在一个单独的函数中拥有这个逻辑,而不是在一个 set 方法中。
  • @Everyone。我意识到在类属性中包含 UI 代码是个坏主意,但是我使用属性网格来设置此属性,并且实际上无法在 propertygrid 接口和它链接到的类之间插入 MessageBox 问题对吧?
  • 也许这不是绑定到属性网格的好选择。你能设置属性,保存结果,让它立即返回,然后根据一些用户操作,运行你的长时间运行的操作吗?

标签: c# .net properties set abort


【解决方案1】:

IMO 这根本不是一件好事 - 期望 是如果 set 没有抛出它分配的值。 执行set 之前在 UI(或任何地方)进行测试,或者抛出并处理异常。或者,调用者可能不会被方法弄糊涂:

public bool TrySetRandomProperty(SomeType value) {
    ...
}

返回truefalse 以表明它是否发生。您还应该避免将 UI 代码渗入域逻辑;也许使用事件让 UI 与用户对话,而不会对调用者造成特定的 UI 实现?

【讨论】:

    【解决方案2】:

    在任何情况下都不应这样做。属性应始终快速并在逻辑上表示某事物的属性。理想情况下,它永远不会失败。它当然不应该产生诸如弹出 UI 之类的副作用。你违反了所有这些重要的准则。不要这样做。

    此外,您的 UI 设计很糟糕。不要事先问用户“这可能需要一段时间,你确定吗?”如果他们点击是,然后长时间等待惩罚他们。相反,开始操作,如果它没有快速返回,则弹出一个 UI 元素,该元素显示一个进度条和一个带有取消按钮的估计剩余时间。

    您可能应该将长时间运行的操作编写为可以在另一个线程上完全取消的异步方法。

    这种事情的一个很好的架构是让你的方法立即返回一个对象,该对象公开诸如“我仍在运行,这是我走了多远”或“我现在完成了,这是结果”之类的事件”,或“我在尝试执行操作时遇到错误,这就是它的原因”。该对象还可以公开一个“取消”方法,该方法知道如何与工作线程通信并干净地关闭它。获取此对象的方法的调用者可以决定如何向用户显示 UI。

    使用此架构,您可以将 UI 逻辑、异步逻辑和业务流程逻辑清晰地相互分离。这是工作,但它会在以后得到回报。

    【讨论】:

      【解决方案3】:

      呃。您真的想在类属性中包含用户界面吗?您不应该在用户界面中进一步检查吗?

      【讨论】:

        【解决方案4】:

        你当然可以这样编码,只是不要设置字段。

        但是,当您将 UI 混合到低级代码中时,您的设计非常糟糕。

        在设置属性之前提出问题是一种选择。

        【讨论】:

          【解决方案5】:

          刚从片场回来。您必须使用一个私有字段来保存您想要设置的值,但是在“取消”中返回应该可以做到。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-26
            • 1970-01-01
            • 2011-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-26
            • 2011-04-18
            相关资源
            最近更新 更多