使用 foreach 的异步方法

BIL*_*ILL 4 c# foreach asynchronous

我有一些异步方法

 public static Task<JObject> GetUser(NameValueCollection parameters)
        {
            return CallMethodApi("users.get", parameters, CallType.HTTPS);
        }
Run Code Online (Sandbox Code Playgroud)

我在下面写了方法

public static IEnumerable<JObject> GetUsers(IEnumerable<string> usersUids, Field fields)
{
    foreach(string uid in usersUids)
    {
        var parameters = new NameValueCollection
                             {
                                 {"uids", uid},
                                 {"fields", FieldsUtils.ConvertFieldsToString(fields)}
                             };
        yield return GetUser(parameters).Result;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法是异步的?如何使用 Parallel.ForEach 编写此代码?

Ori*_*rds 5

有点像这样。

public static IEnumerable<JObject> GetUsers(IEnumerable<string> usersUids, Field fields)
{
    var results = new List<JObject>
    Parallel.ForEach(usersUids, uid => {
        var parameters = new NameValueCollection
                             {
                                 {"uids", uid},
                                 {"fields", FieldsUtils.ConvertFieldsToString(fields)}
                             };
        var user = GetUser(parameters).Result;
        lock(results)
            results.Add(user);
    });
    return results;
}
Run Code Online (Sandbox Code Playgroud)

注意:结果的顺序与您期望的顺序不同。