Winforms 这是在事件中使用Async的安全方法吗

Winforms 这是在事件中使用Async的安全方法吗,winforms,async-await,Winforms,Async Await,我以前使用过任务并行库来保持UI线程的响应性,但我尝试切换到async/await来简化代码。我正在做的项目是WinForms。有一个与视图接口通信的表示层,还有一个包含实现这些接口的winforms表单的程序集,依赖项注入将所有内容绑定在一起。在下面的具体示例中,表单有一个菜单/按钮/etc,它向表示层发送新数据的请求。为了使示例简单,我忽略了异常处理 在表单代码中,我们有这样一个事件处理程序: private async sub DataRequest(sender as object, e

我以前使用过任务并行库来保持UI线程的响应性,但我尝试切换到async/await来简化代码。我正在做的项目是WinForms。有一个与视图接口通信的表示层,还有一个包含实现这些接口的winforms表单的程序集,依赖项注入将所有内容绑定在一起。在下面的具体示例中,表单有一个菜单/按钮/etc,它向表示层发送新数据的请求。为了使示例简单,我忽略了异常处理

在表单代码中,我们有这样一个事件处理程序:

private async sub DataRequest(sender as object, e as EventArgs) handles SomeButton.click
        Dim etask = New Threading.Tasks.Task(Sub() RaiseEvent DataRefreshRequest(Me, EventArgs.Empty))
        etask.Start()
        Await etask
end sub
Private Async Sub HandleDataRequest() Handles _view.DataRefreshRequest
  Dim gdtask = New Tasks.Task(Of IEnumerable(Of Summary))(Function() GetDataTask())
  gdtask.Start()
  _view.Data = Await gdtask
End Sub
不确定是否有一种更整洁的方式来等待事件的提出,上述方法似乎有点笨拙

表示层使用如下代码响应此事件:

private async sub DataRequest(sender as object, e as EventArgs) handles SomeButton.click
        Dim etask = New Threading.Tasks.Task(Sub() RaiseEvent DataRefreshRequest(Me, EventArgs.Empty))
        etask.Start()
        Await etask
end sub
Private Async Sub HandleDataRequest() Handles _view.DataRefreshRequest
  Dim gdtask = New Tasks.Task(Of IEnumerable(Of Summary))(Function() GetDataTask())
  gdtask.Start()
  _view.Data = Await gdtask
End Sub
在这个项目中,我们一直使用.Net 4,所以我们使用的是Microsoft.BCL.Async。GetDataTask实际上是对业务层公开的实体的Linq查询,但是如果没有.Net 4.5,我们就无法使用.ToListSync执行它


我有点不确定的是我在winforms程序集中引发事件的方式。这样做对吗?它似乎工作正常,但我担心这样做会出现任何不可预见的问题。最好从一开始就这样做,然后在该模式普遍使用后发现问题。

使用
任务。运行
比使用
任务的
构造函数更好。启动

除此之外,我只想推荐一些评论。正如您所指出的,理想的解决方案是使用
ToListAsync
并使其真正异步,但考虑到您的平台,这是不可能的


Task.Run
通常用于在后台线程上运行CPU绑定的代码,而此代码不受CPU绑定。因此,我建议您为将来的自我推荐一条评论,这样当您升级到.NET 4.5时,您就可以知道那些
任务。不再需要运行
调用。

谢谢Stephen,这让人放心。任务。运行肯定会把它整理一下。