我正在编写一个必须访问 MySQL 数据库的程序。为此,我编写了一个 PHP WebService 来获取表中的所有值。我遇到的问题是我正在用 C# 编写一个函数来获取这些值。我希望该函数等到调用 DownloadStringCompleted 事件的事件处理程序,然后返回值。我是这样做的:
WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadCompletedHandler);
client.DownloadStringAsync(new Uri(Application.Current.Host.Source.AbsoluteUri + "\\PHP\\GetAdmins.php"));
while (DownloadCompleted == false) { }
return DownloadResult;
但这会使程序挂起。
我需要一些东西来使程序的那部分暂停,直到 DownloadConpleted = true。
我正在运行 Visual Studio Ultimate 2010,正在制作 Silverlight 应用程序,如有任何帮助,我们将不胜感激。
请您参考如下方法:
你可以使用 ManualResetEvent - 从下载完成处理程序发出完成事件信号并让主线程等待它:
ManualResetEvent completionEvent = new ManualResetEvent(false);
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted +=delegate(object sender, DownloadStringCompletedEventArgs e)
{
completionEvent.Set();
};
webClient.DownloadStringAsync(new Uri(Application.Current.Host.Source.AbsoluteUri + "\\PHP\\GetAdmins.php"));
completionEvent.WaitOne();
这回答了你的问题,但它仍然会让 UI 线程等待 - 你真的必须接受与 Silverlight 的异步,所以努力寻找一个在 DownloadStringCompleted 事件处理程序中更新你的模型的解决方案 - 那这样您就不必使用拐杖,您的应用程序将执行得更好。
