Я написал асинхронную функцию для вызова данных из Facebook, она работает, но проблема в том, я полагаю, она работает. Может кто-нибудь объяснить мне?
public class FacebookData
{
static string fb_api_version = ConfigurationManager.AppSettings["fb_ver"];
static string accessToken = ConfigurationManager.AppSettings["accessToken"];
static string fb_id = "";
private HttpClient _httpClient;
public FacebookData(string input_id)
{
fb_id = input_id;
_httpClient = new HttpClient
{
BaseAddress = new Uri("https://graph.facebook.com/" + fb_api_version + "/"),
Timeout = TimeSpan.FromSeconds(15)
};
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public async Task<T> getData<T>()
{
var response = await _httpClient.GetAsync($"{fb_id}?access_token={accessToken}");
if (!response.IsSuccessStatusCode)
return default(T);
var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(result);
}
}
Класс вызова является типичным, я ожидаю ответа.
Но проблема в том, где я это называю.
На основной
static void Main(string[] args)
{
string[] data_Set = [//ids_group]
for (int i = 0; i < data_Set.length; ++i){
Console.WriteLine("Running Thread " + (i+1).ToString());
var dataSet = facebookRequestCmd(data_Set[i]);
writeToTXT(dataSet);
Console.WriteLine("Finished Thread " + (i + 1).ToString());
//do sth
}
}
В facebookRequestCmd
static Dictionary<string, string[]> facebookRequestCmd(string ids){
Dictionary<string, string[]> allData = new Dictionary<string, string[]>();
string[] ids_arr = ids.split(",")
for (var i = 0; i < ids.length; i++){
var facebook_client = new FacebookData(sqlData);
var response = facebook_client.getData<dynamic>();
Task.WaitAll(response);
//then use the result to do sth
}
}
В моем понимании, каждый раз, когда я вызываю getData, он уже возвращается к основному потоку, поскольку ожидает данные. Таким образом, задача на самом деле не запускает новый поток.
Таким образом, async await работает для ожидания http-запроса, но Threading не должен работать.
Тем не менее,
Console.WriteLine("Running Thread " + (i+1).ToString());
выскакивает одновременно, как будто я действительно делаю Thread в цикле for в основной функции.
Почему? И это способ использовать многопоточность с Async-await. Как я хочу сделать несколько звонков одновременно.
Изначально я использую Parallel.ForEach для запуска вызова, однако это не асинхронно и блокирует поток.