Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Xamarin Android和C#.Net中使用AsyncTask计算多个网站的加载时间_C#_Android_Xamarin - Fatal编程技术网

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

在Xamarin Android和C#.Net中使用AsyncTask计算多个网站的加载时间,c#,android,xamarin,C#,Android,Xamarin,我有一个包含网站地址的字符串数组: string[] arr = new string[] { "https://www/google.com", "https://www.yahoo.com", "https://www.microsoft.com" }

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

string[] arr = new string[]
                {
                    "https://www/google.com",
                    "https://www.yahoo.com",
                    "https://www.microsoft.com"
                };
我必须将这些URL作为参数发送到
asynctask
方法,以便能够计算每个网站的加载时间。我不必显示网站页面,因此我不使用
webview

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

加载时间 谷歌-00:00:04:092345(小时:分钟:秒:毫秒)雅虎-00:00:06:028458


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

以下是一个简单的解决方案

这既不完整也不完美。它将为您提供一个URL的加载时间。还有一个建议是如何将其扩展到多个URL

您需要一个
WebView
,可以是在代码中,也可以是从用户界面

使用
WebView.LoadUrl(“https://www/google.com");

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

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());
因此,从这里开始,您必须创建一个
字典
,URL为
,加载时间为
。最初将所有加载时间设置为0。更新
OnPageFinished()
中每个URL对应的值。创建一个
异步任务
函数,该函数将返回已填充的字典

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;
}
和实现类:

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;
        }
公共异步任务GetLoadTimeTakenAsync(列表myClassList)
{
Parallel.ForEach(myClassList,myClassObj=>
{
使用(var client=new HttpClient())
{
myClassObj.StartTime=DateTime.Now;
var stream=client.GetStreamAsync(myClassObj.URL)
.ContinueWith((s)=>
{
如果(已完成)
{
var myClassObjCompleted=myClassList.Where(x=>x.URL==myClassObj.URL).First();
myClassObjCompleted.EndTime=DateTime.Now;
myClassObjCompleted.timetake=myClassObj.EndTime-myClassObj.StartTime;
}
});
运行(异步()=>等待流);
}
});
while(myClassList.Any(x=>x.timetake==null))
{
等待任务。延迟(1);
}
返回myClassList;
}
//创建文本视图以显示Wifi的状态
text视图wifitext=findviewbyd(Resource.Id.WifiTextView);
//配置Wifi连接
var connectivityManager=(connectivityManager)GetSystemService(ConnectivityService);
var activeConnection=connectivityManager.ActiveNetworkInfo;
if(activeConnection!=null&&activeConnection.IsConnected)
{
wifitext.Text=“WIFI可用”;
字符串[]URL地址=新字符串[]{”https://www.google.com/", "https://www.yahoo.com/"};
for(int i=0;i
谢谢Rohit……我使用dynamic textview打印输出。您能告诉我如何在这行上使用Wait函数吗。我使用异步方法通过此语句读取url的数据块。Stream listurl=client.OpenRead(url);对不起,我不明白你想做什么。你能将问题更新为编辑吗?我想做的是………我正在按如下方式打印结果………谷歌--00:00:04:5678雅虎--00:00:04:5678我正在同步循环打印它们。我需要做的是,当发送请求时,如果响应仍然挂起,它必须发送另一个请求并再次检查响应。当发现响应时,我必须打印输出…………异步方式。我需要异步发送请求,并使用WaitStart多个请求记录o/p,并计算e的加载时间每个网站完成加载时------异步使用async/Await我认为您最好使用
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;
        }
        //Create TextView to display status of Wifi
       TextView wifitext = FindViewById<TextView>(Resource.Id.WifiTextView);

        //Configuring Wifi connection
        var connectivityManager = (ConnectivityManager)GetSystemService(ConnectivityService);
        var activeConnection = connectivityManager.ActiveNetworkInfo;

        if (activeConnection != null && activeConnection.IsConnected)
        {
            wifitext.Text = "WIFI AVAILABLE";

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


            for (int i = 0; i < urladdress.Length; i++)
            {
                string url = urladdress[i];

                //Call async method
                Task returnedTask = Task_MethodAsync(url);
            }

         }
        else
           wifitext.Text = "WIFI UNAVAILABLE";        
    }

    public async Task Task_MethodAsync(string url)
    {
        LinearLayout ll = FindViewById<LinearLayout>(Resource.Id.linearLayout1);

        WebClient client = new WebClient();
       Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();

        Stream listurl = client.OpenRead(url);
        StreamReader reader = new StreamReader(listurl);

        stopwatch.Stop();
        // listurl.Close();

        var time = Convert.ToString(stopwatch.Elapsed);