我有这段代码:
public static String Download(string address) {
WebClient client = new WebClient();
Uri uri = new Uri(address);
// Specify a progress notification handler.
client.DownloadProgressChanged += (_sender, _e) => {
//
};
// ToDo: DownloadStringCompleted event
client.DownloadStringAsync(uri);
}
在下载完成后,我可以在DownloadStringCompleted
事件处理程序中执行其余代码,而不是{@ 1}}这个异步请求吗?它将被放置在另一个线程中(这样做,因此我可以访问下载进度)。我知道Join
可以采取第二个参数;手册中名为DownloadStringAsync
的对象。这可能有用吗?谢谢,
答案 0 :(得分:2)
您可以使用manual reset event:
class Program
{
static ManualResetEvent _manualReset = new ManualResetEvent(false);
static void Main()
{
WebClient client = new WebClient();
Uri uri = new Uri("http://www.google.com");
client.DownloadProgressChanged += (_sender, _e) =>
{
//
};
client.DownloadStringCompleted += (_sender, _e) =>
{
if (_e.Error == null)
{
// do something with the results
Console.WriteLine(_e.Result);
}
// signal the event
_manualReset.Set();
};
// start the asynchronous operation
client.DownloadStringAsync(uri);
// block the main thread until the event is signaled
// or until 30 seconds have passed and then unblock
if (!_manualReset.WaitOne(TimeSpan.FromSeconds(30)))
{
// timed out ...
}
}
}
答案 1 :(得分:1)
我的第一个想法是使用DownloadStringAsync
同步版DownloadStringAsync
。但是,您似乎必须使用异步方法来获取进度通知。好的,这没什么大不了的。只需订阅DownloadString并使用简单的等待句柄DownloadStringCompleted来阻止它直到完成。
一个注意事项,我不确定是否为DownloadStringAsync
提出了进度通知。根据MSDN,ManualResetEventSlim与某些异步方法相关联,但不与{{1}}相关联。