异步/等待和条件编译

时间:2016-11-02 16:38:37

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

我正在编写将在

中使用的共享代码库
  • 一个闪亮的移动设备便携式类库和
  • 使用.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宏)?

2 个答案:

答案 0 :(得分:0)

看一下AsyncBridge,您只需要在项目中添加一个文件,以便在.NET 4.0 / 3.5中使用await / async。

答案 1 :(得分:-1)

作为一般经验法则不应使用条件编译符号。 例外情况可能是" #if DEBUG"

但是对于这样的事情,特别喜欢这样。您需要退后一步并遵循正确的.Net库架构。

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

但是从长远来看,更清洁的文件可以为您节省大量时间。 更不用说.net 3.5即将推出。 此外,还有一大堆真正令人敬畏的功能在4.5中添加。也许是时候完全重新修改图书馆以获得最新和最好的功能。

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