【问题标题】:.net Await with existing/old code.net 等待现有/旧代码
【发布时间】:2016-03-21 12:46:10
【问题描述】:

我有一个现有的 dll,其功能可能需要一些时间来检索客户数据。到目前为止,我一直在使用良好的旧 threading.thread.start 方法来防止 UI 锁定,但我一直在尝试了解 .net 4.5 中的 Await/Async 方法。 有没有一种简单的方法可以围绕这些函数创建一个 Await 包装器?我可以将 dll 更新到 4.5,但不能更改代码本身的结构。我尝试的一切都会导致错误.. 'Await 要求 'Boolean' 类型有合适的 GetAwaiter 方法'

示例代码是....

    Public Async Function GetByID(id As Integer) As Task(Of Boolean)
        'serviceBase is a dll with a number of functions for getting
        'data that returns true when a customer object has been filled
        Return Await ServiceBase.GetCustomer(id)
    End Function

我不明白的是,如果我可以在 ServiceBase 中更新 GetCustomer,那么我必须将其标记为异步并返回一个任务(布尔值)。但是后来我得到了错误,因为 GetCustomer 在任何时候都不需要使用 Await - 它的一些小进程总共加起来是一个被阻止的 UI。

【问题讨论】:

  • 获取客户的行为实际上是异步操作吗?制作同步方法Async 毫无意义。你能在 GetCustomer 中显示代码吗,在这种情况下更有趣。
  • 该函数的一个示例(例如,客户可能有关于源 A 和 C 的详细信息)' Public Function GetCustomer(id As Integer) As Boolean If GetFromSourceA(id) Then '与客户一起工作并返回 true End If GetFromSourceB(id) Then '与客户合作并返回 true End If GetFromSourceC(id) Then '与客户合作并返回 true End If IsNothing(customer) Then Return False Return True End函数'
  • @kai 的意思是,除非GetCustomer 返回一个任务,否则调用Await GetCustomer 不会自动使其异步。 async/await 是一种语法糖,它使得 awaiting 对于already 异步方法更容易。例如,如果GetCustomer 调用Web 服务,您可以使用Await client.CallThatMethodAsync 异步调用服务方法并获取结果,而不是同步调用client.CallThatMethod。如果是数据库访问方式,可以使用ExecuteReaderAsync 而不是ExecuteReader
  • 那么我们是说在场景中我最好的方法是像我一样创建一个线程,而 Await 并不适合这种场景?

标签: vb.net async-await


【解决方案1】:

如果您想要异步包装器的方法不是真正的异步,例如,它们不是真正的 I/O,而是长期存在的进程会阻塞您的 UI,例如桌面应用程序,只需将实际调用包装到Await Task.Run(Function() ServiceBase.GetCustomer(id)) 中的 dll 方法。如果是asp.net应用,允许同步操作是同步的。

您不想做的是创建一个虚假的异步包装器并通过调用 Task.Run 将其添加到您的 dll 中。如果某些东西受 CPU 限制并且阻塞了您的 UI(桌面应用程序),只需在您的特定应用程序上下文中使用 Task.Run 调用它,并且不要在您的 dll 中创建虚假的异步实现。以下是 Stephen Cleary 关于此事的一些重要资源:

Stephen Cleary's Blog on Task.Run

【讨论】:

  • 非常感谢,我不想接触 DLL 的主要原因是我希望那里的功能保持同步,而改变它感觉不对。该资源证实了我的想法,这将是一种不好的做法,因此在栅栏的 UI/应用程序端使用 Task.Run 更改为 Async 效果很好。我想在一天结束时,除了拥有更容易理解/阅读的代码之外,我并没有真正获得太多 - 看到我正在重写其中的一些内容,这似乎是一项值得的工作。
  • 完全明白。我最近在类似的场景中使用了一个桌面应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多