如何在主UI线程中等待用户交互而不阻止它?

时间:2016-11-21 18:25:33

标签: .net wpf vb.net asynchronous

假设我有一个在主UI线程上运行的实例方法的场景,将自定义UserControl(WPF)添加到主应用程序窗口,可以通过单例访问,然后需要等待进一步执行,直到用户与UserControl进行交互,并返回一些值。

我的第一次尝试总是会阻止UI线程,因此用户实际上无法与UserControl进行交互,直到我最终遇到asyncawait

以下是我提出的解决方案的简化要点:

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)是否浪费,或者它在开销方面实际上是否非常轻量级。

1 个答案:

答案 0 :(得分:1)

虽然可以 await UI things such as button clicks,但这样做有问题。如果用户做了其他事情,比如关闭那个窗口怎么办?或点击其他地方?

设计一个不会将用户限制在单个UI工作流程中的用户体验会更好。