使用Task执行异步操作但UI仍然没有响应

Uda*_*119 0 .net vb.net wpf task-parallel-library

我有一个WPF应用程序,我必须在其中执行一个长期运行的任务(基本上从网络读取).只是为了给你一个快照,我在按钮点击时做了以下事情

 Dim t As Task(Of String) = Task.Factory.StartNew(Of String)(Function()
                                                                        'Thread.sleep is simulating long running task that will make UI unresponsive
                                                                        Thread.Sleep(10000)
                                                                        Return "Hello world from async task"
                                                                    End Function)

        TextBlock1.Text = t.Result
Run Code Online (Sandbox Code Playgroud)

我不能使用基于事件的异步方法,因为读取API实际上存在于我在程序中引用的包含函数的dll中Public function ReadFromNetwork() as String.此API正在对网络进行异步调用以读取长字符串并返回到UI.所以,总之我正在做TextBlock1.Text = ExternalDll.ReadFromNetwork().

但问题是,即使我使用Task异步,UI仍然没有响应.

你可以检查我是否遗漏了代码中的内容.

任何帮助/建议将提前得到Thanx的高度赞赏

Jon*_*eet 8

您在t.Result开始任务后正在使用该线路.这将使线程阻塞直到任务完成 - 所以所有的异步都是徒劳的.

您应该附加一个continuation Task.ContinueWith,并使用任务结果将代码放入该continuation中.这将允许UI在任务执行时返回处理事件,然后在任务完成时触发继续操作.传入TaskScheduler.FromCurrentSynchronizationContext以确保连续性在正确的线程上触发.

请注意,在下一版本的VB/C#中,使用异步方法可以轻松地完成所有这些操作.如果你能够使用.NET 4.5候选版本,你应该考虑立即尝试 - 它会让你的生活更简单.

  • @ Uday0119:.NET 4.5不限于Windows 8. (2认同)