好吧,可以忽略我所做的所有更改,但是我不得不修改一些变量的读取方式和代码的外观。这不是一个有效的应用程序,我显然没有测试过它。这只是一个清理过的版本,有一个建议的使用方法
Task
.它也被嘲笑使用的只是你提供的代码,所以它是什么。#2是,我相信,你需要的答案。
-
在
Main
我去掉了“线程”这个词,因为事实上这不是发生的事情。可能是这样,但是我们不知道httpclient是否真的正在启动一个新线程,或者只是保持/返回剩余的调用。使用
async
/
await
并不总是意味着
Thread
开始了(尽管这样想很常见)。
-
我用过
.Result
(不是
Wait()
正如我在评论中建议的那样)获得任务的结果。这是可以的,因为它是一个控制台应用程序,但不理想的现实世界的应用程序,需要运行而不阻塞。我也移除了
Task.WaitAll
有了这个变化。
-
我将函数重命名为具有措辞,因为在IMO中,函数应该执行工作,命名应该描述正在执行的工作。
-
我重命名了一些变量,因为在imo中,当变量的作用域不在方法中时,变量应该是pascalcase;当变量在方法中时,应该是private和camelcase。在我看来,名字后面应该是
Type
这是有道理的。
-
我在返回的函数名后面附加了“async”
任务
.
-
改变
FacebookClient
单身,只允许一个
HttpClient
用以代替许多,并允许它被处理;加上更多。
-
添加了
GetFacebookData
调用任务并同时等待它们的函数。
static void Main(string[] args)
{
string[] dataSet = new string[] { /* mocked */ }; // [ids_group]; <- no idea what this is so I mocked it.
for (int i = 0; i < dataSet.Length; i++)
{
Console.WriteLine("Main... " + (i + 1).ToString());
var result = GetFacebookData(dataSet[i]);
WriteToTxt(result);
Console.WriteLine("Complete... " + (i + 1).ToString());
//do sth
}
Console.Read();
}
private static Dictionary<string, string[]> GetFacebookData(string idsString)
{
var allDataDictionary = new Dictionary<string, string[]>();
var idsArray = idsString.Split(',');
foreach (var id in idsArray)
{
var response = FacebookClient.Instance.GetDataAsync<string[]>(id).Result;
allDataDictionary.Add(id, response);
}
return allDataDictionary;
}
public class FacebookClient
{
private readonly HttpClient httpClient;
private readonly string facebookApiVersion;
private readonly string accessToken;
public static FacebookClient Instance { get; } = new FacebookClient();
FacebookClient()
{
facebookApiVersion = ConfigurationManager.AppSettings["fb_ver"];
accessToken = ConfigurationManager.AppSettings["accessToken"];
httpClient = new HttpClient
{
BaseAddress = new Uri("https://graph.facebook.com/" + facebookApiVersion + "/"),
Timeout = TimeSpan.FromSeconds(15)
};
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public async Task<T> GetDataAsync<T>(string facebookId)
{
var response = await httpClient.GetAsync($"{facebookId}?access_token={accessToken}");
if (!response.IsSuccessStatusCode) return default;
var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(result);
}
~FacebookClient() => httpClient.Dispose();
}
这是一个启动所有任务然后同时等待所有任务的版本。我相信这可能会给你一些关于
http客户端
但我们会看到的。
private static Dictionary<string, string[]> GetFacebookData(string idsString)
{
var allDataDictionary = new Dictionary<string, string[]>();
var idsArray = idsString.Split(',');
var getDataTasks = new List<Task<string[]>>();
foreach (var id in idsArray)
{
getDataTasks.Add(FacebookClient.Instance.GetDataAsync<string[]>(id));
}
var tasksArray = getDataTasks.ToArray();
Task.WaitAll(tasksArray);
var resultsArray = tasksArray.Select(task => task.Result).ToArray();
for (var i = 0; i < idsArray.Length; i++)
{
allDataDictionary.Add(idsArray[i], resultsArray[i]);
}
return allDataDictionary;
}