我有一个包含网站地址的字符串数组:
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/