C# Xamarin Android DownloadString需要很长时间,甚至不起作用
我昨天开始在Android上使用Xamarin,是的,很不错。 当然,我和每个人一样,都会犯一些错误 我尝试的只是使用以下代码行异步下载www.google.com的HTML:C# Xamarin Android DownloadString需要很长时间,甚至不起作用,c#,android,asynchronous,xamarin,mono,C#,Android,Asynchronous,Xamarin,Mono,我昨天开始在Android上使用Xamarin,是的,很不错。 当然,我和每个人一样,都会犯一些错误 我尝试的只是使用以下代码行异步下载www.google.com的HTML: private async void btnAuthenticate_Click(object sender, System.EventArgs e) { Toast.MakeText(this, "method is being called", ToastLength.Long).Sh
private async void btnAuthenticate_Click(object sender, System.EventArgs e)
{
Toast.MakeText(this, "method is being called", ToastLength.Long).Show();
string test = await Task.Run(() => new WebClient().DownloadString("http://google.de/"));
Toast.MakeText(this, test, ToastLength.Long).Show();
}
当点击按钮时,Toast“method is called”(正在调用方法)会出现,并且几乎没有其他内容。起初,至少需要1.5分钟来显示一些反应,要么应用程序崩溃,什么也不做,要么打印出我想要的东西。假设在10次尝试时,它打印出预期值的2倍
我在WPF C#桌面应用程序中尝试了相同的代码,效果很好
应用程序甚至没有冻结或其他东西。
调试器的输出基本相同:
“工人启动”
或者有时它会说“爬山,更改最大线程数x”
或
“线程已启动:#X”
我不知道这是否相关
另外,我正在使用VisualStudio2015和Xamarin for Android(目前试用30天)
编辑:我修改了应用程序,一旦应用程序以相同的行为启动,就开始下载网页。然后我创建了一个logcat日志,您可以从中看到
编辑²:这次我还使用Xamarin Studio创建了一个新项目。我修改了以下内容:
提前感谢。您的代码的异步性质没有问题
Toast
仅用于显示短消息
对我来说,网络请求http://google.de/
包含约48k个字符。赋予Toast
那么多内容将导致它在构建视图以呈现到屏幕时锁定UI线程
您可以通过围绕web请求包装一个进度对话框来验证代码是否确实是异步的:
var pd = ProgressDialog.Show(this, "Downloading...", "Fetching content from \"http://google.de/\"");
string content = await Task.Run(() => new WebClient().DownloadString("http://google.de/"));
pd.Dismiss();
您会注意到,
ProgressDialog
将出现并旋转(这意味着web请求位于后台线程中,因为UI未锁定),当web请求任务完成时,它将关闭。我可能会说,我已经正确地调试了我的应用程序,它肯定是需要很长时间才能完成的异步代码。现在我用你的代码再次测试了它。ProgressDialog正在加载至少1分钟。就在那之后,Visual Studio打开了一个小窗口,说在没有更多信息的情况下发生了一个未经处理的异常。在这种情况下,在您的问题中包含logcat输出,因为这将提供有关错误原因的线索。确保您的清单中也包含了android.permission.INTERNET
。是的,有时它像我说的那样工作,但只在1分钟后。但大多数情况下,它只是抛出未处理的异常。我尝试了这个例子:我将完全相同的代码放入我的应用程序中,并且一切正常。但是,一旦我将URL更改为另一个URL,它将花费1分钟,在这一分钟之后,它将显示正确的结果。