假设我有一个在主UI线程上运行的实例方法的场景,将自定义UserControl
(WPF)添加到主应用程序窗口,可以通过单例访问,然后需要等待进一步执行,直到用户与UserControl
进行交互,并返回一些值。
我的第一次尝试总是会阻止UI线程,因此用户实际上无法与UserControl
进行交互,直到我最终遇到async
和await
。
以下是我提出的解决方案的简化要点:
Public Class ControlManagerA
Inherits ControlManagerBase
Public Property userControlResult As String
Public Overrides Async Function CreateAndWait() As Task
'Initialize to some default value to indicate that no response was received yet.
userControlResult = Nothing
Dim myCustomControl As New MyCustomUserControlA()
'Could also pass any additional parameters required for display.
myCustomControl.AssignParent(Me)
GlobalUIManager.GetMainWindow().AssignUserControl(myCustomControl)
'This will eventually be populated with a proper value due to
'user interaction in MyCustomUserControlA.
While userControlResult Is Nothing
'This is the part that I am a little unhappy about.
Await Task.Delay(1)
End While
GlobalUIManager.GetMainWindow().RemoveUserControl(myCustomControl)
DoSomethingWithResult(userControlResult)
End Function
End Class
困扰我的一件事是我忙着在那里等待。 (而且我可能也可以将userControlResult
作为ByRef
参数传递,而不是等待MyCustomUserControlA
通过公共属性访问它。)
解决方案仍然适合我,我根本没有注意到任何性能问题,但我想知道是否有更好的方法来等待结果。我也不知道Task.Delay(1)
是否浪费,或者它在开销方面实际上是否非常轻量级。
答案 0 :(得分:1)
虽然可以 await UI things such as button clicks,但这样做有问题。如果用户做了其他事情,比如关闭那个窗口怎么办?或点击其他地方?
设计一个不会将用户限制在单个UI工作流程中的用户体验会更好。