在我的应用程序中,我有一个应该从网站下载字符串的 Web 客户端。它下载了相当多的文本,大约 20 行左右。但是,当我下载文本时,GUI 在下载时冻结,然后在下载完成后恢复。我怎样才能防止这种情况?
我正在使用 Visual Basic 2010、.NET 4.0、Windows 窗体和 Windows 7 x64。
您可以为此使用任务并行库
Task.Factory.StartNew(() =>
{
using (var wc = new WebClient())
{
return wc.DownloadString("http://www.google.com");
}
})
.ContinueWith((t,_)=>
{
textBox1.Text = t.Result;
},
null,
TaskScheduler.FromCurrentSynchronizationContext());
PS:虽然您可以将此模板用于任何没有异步版本的方法,但 WebClient.DownloadString 确实有一个,所以我会选择 Karl Anderson 的答案
在工作线程中而不是在 GUI 线程中执行时间密集型任务。这将防止事件循环冻结。
另一种选择是使用DownloadStringAsync
,这将触发来自 UI 线程的请求,但它不会阻塞线程,因为它是一个异步请求。下面是一个使用示例DownloadStringAsync
:
Public Class Form1
Private Sub AlertStringDownloaded(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
' Did the request go as planned (no cancellation or error)?
If e.Cancelled = False AndAlso e.Error Is Nothing Then
' Do something with the result here
'e.Result
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim wc As New WebClient
AddHandler wc.DownloadStringCompleted, AddressOf AlertStringDownloaded
wc.DownloadStringAsync(New Uri("http://www.google.com"))
End Sub
End Class