C# Xamarin Android DownloadString需要很长时间,甚至不起作用

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

我昨天开始在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).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创建了一个新项目。我修改了以下内容:

  • 添加了对清单的Internet权限
  • 将默认按钮代码更改为“我的需要”
  • 这是这个应用程序的来源,有人可以自己尝试一下,并告诉我是否需要超过30秒才能发出这个webrequest,它应该在1-2秒内完成

    我希望你们能帮我。
    提前感谢。

    您的代码的异步性质没有问题
    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分钟,在这一分钟之后,它将显示正确的结果。