c# - 在 Xamarin Android 和 C#.Net 中使用 AsyncTask 计算多个网站的加载时间

标签 c# android xamarin

我有一个包含网站地址的字符串数组:

string[] arr = new string[]
                {
                    "https://www/google.com",
                    "https://www.yahoo.com",
                    "https://www.microsoft.com"
                };

我必须将这些 URL 作为参数发送给 asynctask 方法,以便我能够计算每个网站的加载时间。我不需要显示网站页面,所以我没有使用 webview

我可以使用秒表或httprequest 来计算加载时间,我的最终目标是所有网站都需要异步同时开始加载,输出必须如下所示

加载时间

google - 00:00:04:092345 (hr:min:sec:millisec) yahoo - 00:00:06:028458

如何将数组发送到 asynctask 以及如何在不使用 await 的情况下生成加载时间?

最佳答案

这是您可以执行的操作的简要解决方案。

这并不完整也不完美。它会给你一个 URL 的加载时间。还有关于如何将其扩展到多个 URL 的建议。

您将需要一个 WebView,无论是在代码中还是在 UI 中。

使用 webview.LoadUrl("https://www/google.com"); 将 URL 加载到 WebView

通过从 WebViewClient 扩展它来创建一个新的 class,如下所示:

public class myWebViewClient : WebViewClient
{
    public override void OnPageFinished(WebView view, string url)
    {
        base.OnPageFinished(view, url);
        Console.WriteLine("OnPageFinished for url : " + url + " at : " + DateTime.Now);
    }
 }

在您的 OnCreate() 方法中添加以下代码行:

 webview.SetWebViewClient(new myWebViewClient());

因此,从这里开始,您需要做的是,创建一个 Dictionary,其中 URL 作为 key,加载时间作为 value。最初将所有加载时间设置为 0。更新 OnPageFinished() 中每个 URL 对应的值。创建一个 async Task 函数,它将返回填充的字典。

public async Task<Dictionary<string, double>> myAsyncFunction()
{
     await Task.Delay(5);  //to make it async
     //Wait till all the OnPageFinished events have fired. 
     while (myDictionary.Any(x=>x.Value == 0) == true)
     {
         //there are still websites which have not fully loaded. 
         await Task.Delay(1);  //wait a millisecond before checking again
     }
     return myDictionary;
}

您可以在与 UI 不同的线程中调用 myAsyncFunction() 并实现 ContinueWith() 或者让它在单独的线程中运行并将输出写入您可以在需要时检查的地方。 例如:Task.Run(async () => await myAsyncFunction());

更新:基于 OP 的评论

在 UI 线程中:

  var myClassList = new List<myClass>
  { 
       new myClass{URL = "https://www/google.com", TimeTaken = null},
       new myClass{URL = "https://www.yahoo.com", TimeTaken = null},
       new myClass{URL = "https://www.microsoft.com", TimeTaken = null}
  };

   Console.WriteLine("Started at : " + DateTime.Now.ToShortTimeString());

   var business = new BusinessLogic();
   var loadtimetask = business.GetLoadTimeTakenAsync(myClassList);
   await loadtimetask;

   Console.WriteLine("Completed at : " + DateTime.Now.ToShortTimeString());

和实现类:

public async Task<List<myClass>> GetLoadTimeTakenAsync(List<myClass> myClassList)
        {
            Parallel.ForEach(myClassList, myClassObj =>
            {
                using (var client = new HttpClient())
                {
                    myClassObj.StartTime = DateTime.Now;
                    var stream = client.GetStreamAsync(myClassObj.URL)
                                        .ContinueWith((s) =>
                                        {
                                            if (s.IsCompleted)
                                            {
                                                var myClassObjCompleted = myClassList.Where(x => x.URL == myClassObj.URL).First();
                                                myClassObjCompleted.EndTime = DateTime.Now;
                                                myClassObjCompleted.TimeTaken = myClassObj.EndTime - myClassObj.StartTime;
                                            }
                                        });
                    Task.Run(async () => await stream);
                }
            });

            while (myClassList.Any(x => x.TimeTaken == null))
            {
                await Task.Delay(1);
            }

            return myClassList;
        }

关于c# - 在 Xamarin Android 和 C#.Net 中使用 AsyncTask 计算多个网站的加载时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32708051/

相关文章:

c# - 打印到新页面的转义序列

c# - urlencode问题

java - 是否可以通过 id 获取 mipmap 图像?

android - Android 计费示例中 IabHelper 类的在线文档?

android - 错误 - 找不到与给定名称匹配的资源(在 'MvxItemTemplate' 处,值为 '@layout/itemc')

ios - 插入 Xamarin NSMutableArray<T> 导致超出范围异常

c# - 多台服务器上的批处理

c# - 在 IMemoryCache 中存储和检索列表

android - 以编程方式使用 relativeLayout 不适用于 deep inner child

ios - Xamarin 表单 - IOS : How to detect the UIView size changed