【问题标题】:Async/await and conditional compilation异步/等待和条件编译
【发布时间】:2016-11-02 16:38:37
【问题描述】:

我正在编写一个共享代码库,将用于

  • 适用于移动设备的全新可移植类库和
  • 使用 .NET 3.5 的旧项目。

因此,我的代码包含很多:

#If PCL Then
    Await AlertAsync("...some message...", "...some title...")
#Else
    MessageBox.Show("...some message...", "...some title...")
#End If

这是重复的,因此是丑陋的。

通常,如果某些内容重复,解决方案是将其提取到方法中。不幸的是,我在这里看不到如何执行此操作,因为 (1) 我 必须 使用 await 在 PCL 案例中调用该方法,并且 (2) 我 不得 > 在 .NET 3.5 中使用 await,因为编译器无法处理它。我希望喜欢拥有这样的东西:

AwaitIfNet45OrHigher ShowAlert("...some message...", "...some title...")

...

#If PCL Then
    Private Async Function ShowAlert(...) As Task
        ...async implementation...
    End Sub
#Else
    Private Sub ShowAlert(...)
        ....NET 3.5 implementation...
    End Sub
#End If

但是,可惜的是,VB.NET 语言中没有 AwaitIfNet45OrHigher 关键字。

我错过了任何其他解决方案(除了求助于 T4 宏)?

【问题讨论】:

  • 为什么没有两个方法,ShowAlert 和 ShowAlertAsync 并且不为 3.5 编译第二个?
  • @ScottChamberlain:这基本上就是我现在所拥有的(在第一个代码示例中,将 MessageBox.Show 替换为 ShowAlert 并将 AlertAsync 替换为 ShowAlertAsync)。我仍然需要 5 行代码并两次提及每个参数。我想要一行代码并提到每个参数一次。 :-)
  • Else 和 EndIf 可以放在方法名之后,参数之前。
  • 如果您正在编写一个库,您能否将“向用户显示警报并等待他们确认”作为您的消费者必须提供的回调/事件?这样一来,您就不会被特定的 UI 技术(例如 MessageBox)所束缚,这意味着您的库也可以更广泛地适用。
  • @Damien_The_Unbeliever:当然,我可以做到。尽管如此,最初的问题仍然存在:我需要在 .NET 4.5 中使用 await 调用回调,而在 .NET 3.5 中无需等待。

标签: .net vb.net async-await code-reuse conditional-compilation


【解决方案1】:

看看AsyncBridge,你只需要在你的项目中添加一个文件,等待/异步就可以在.NET 4.0 / 3.5中工作。

【讨论】:

【解决方案2】:

一般来说,条件编译符号永远不应该被使用。 异常可能是“#if DEBUG”

但是对于这样的事情,尤其是这样的事情。您需要退后一步,遵循正确的 .Net 库架构。

这两件事可能看起来一样,但它们完全不同。 您需要为 .NET 4.5 创建一个新库 -是的,当您拉入项目时,您将在一段时间内拥有该项目的两个版本

但从长远来看,更干净的文件将为您节省大量时间。 更不用说 .net 3.5 即将推出。 此外,在 4.5 中还添加了一大堆非常棒的功能。也许是时候彻底改造库以获得最新和最强大的功能了。

此外,处理器升级重写可以通过 Peacemill 完成。仅在版本化项目中重写您现在需要的函数,并在可移植库中引用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多