在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);