Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行并行任务_C#_Multithreading_Windows Runtime_Windows Store Apps_Async Await - Fatal编程技术网

C# 运行并行任务

C# 运行并行任务,c#,multithreading,windows-runtime,windows-store-apps,async-await,C#,Multithreading,Windows Runtime,Windows Store Apps,Async Await,在windows应用商店应用程序项目中,我有一个函数,在foreach循环中调用多次以填充某些对象 方法头如下所示 private async Task createInvite(JsonValue item, string meetingid, List<MeetingInvitee> listInvitees) 我试着在类似这样的并行任务中运行它 List<Task> ts = new List<Task>(); foreach (JsonValue i

在windows应用商店应用程序项目中,我有一个函数,在foreach循环中调用多次以填充某些对象

方法头如下所示

private async Task createInvite(JsonValue item, string meetingid, List<MeetingInvitee> listInvitees)
我试着在类似这样的并行任务中运行它

List<Task> ts = new List<Task>();
foreach (JsonValue item in invitees)
{
    ts.Add(createInvite(item, meetingid, listInvitees));
}

await Task.WhenAll(ts);
但它似乎不会创建同时运行的任务。这大约需要10秒钟

如果我用这个

//List<Task> ts = new List<Task>();
foreach (JsonValue item in invitees)
{
    //ts.Add(createInvite(item, meetingid, listInvitees));
      await createInvite(item, meetingid, listInvitees);
}

//await Task.WhenAll(ts);
它也需要大约10秒钟

我的第一个选项不是同时运行多个任务吗

编辑


您的代码实际上不是异步的,它没有等待语句,因此所有的工作都发生在for循环内的初始createInvite调用中


您可以使用parallel.ForEach使其实际并行运行,但这会破坏您的代码,因为它实际上不是线程安全的。

您的方法没有真正的异步。简单地添加async修饰符并不能神奇地使它异步,或者并行执行,我认为这正是您想要做的。它所做的只是向编译器发出需要生成状态机的信号。这段代码将完全同步执行


您可以使用Task.Run或Parallel.ForEach在线程池线程上显式调用您的方法,但从代码看,这样做似乎根本不是线程安全的。在继续之前,尝试将CreateInvite隔离为线程安全的,然后查看上面提到的选项之一。

使用?您的代码实际上是异步的吗?向我们展示您的createInvite方法。您当前的代码正在生成一个编译器警告,确切地解释您的错误所在。有关如何做的任何提示?确保代码线程安全?您可以从消除全局变量开始,并使方法调用的所有内容都是局部的。和
private async Task createInvite(JsonValue item, string meetingid, List<MeetingInvitee> listInvitees)
{
    try
    {

        Stopwatch st = Stopwatch.StartNew();
        MeetingInvitee org = new MeetingInvitee();
        MeetingInvitee altorg = new MeetingInvitee();
        JsonObject invitee2;
        JsonObject invitee;
        InviteeDB InviteeForDB = new InviteeDB();
        GappService gappservice = new GappService();

        MeetingInvitee inv = new MeetingInvitee();


        JsonObject.TryParse(item.Stringify(), out invitee2);

        invitee = invitee2["user"].GetObject();



        if (invitee2.ContainsKey("_id"))
        {
            inv.id = invitee2["_id"].GetString();
            InviteeForDB.Id = invitee2["_id"].GetString();
        }
        else
        {
            InviteeForDB.Id = invitee2["user"].GetString();
        }

        if (invitee2.ContainsKey("status"))
        {
            if (invitee2["status"].ValueType == JsonValueType.Null)
            {
                inv.status = string.Empty;
                InviteeForDB.Status = string.Empty;
            }
            else
            {
                inv.status = invitee2["status"].GetString();
                InviteeForDB.Status = invitee2["status"].GetString();
            }
        }
        Stopwatch st2 = Stopwatch.StartNew();
        if (invitee2.ContainsKey("user"))
        {

            if (invitee2["user"].ValueType != JsonValueType.Null)
            {
                User iUser = new User();
                //iUser.Id = InviteeForDB.UserID;

                JsonSerializerSettings sett = new JsonSerializerSettings();
                sett.NullValueHandling = NullValueHandling.Ignore;
                iUser = JsonConvert.DeserializeObject<User>(invitee.Stringify(), sett);

                inv.user = iUser;
            }
            else
                return;
        }
        else
            return;

        InviteeForDB.MeetingID = meetingid;
        ds.inviteeRepository.Add(InviteeForDB);
        listInvitees.Add(inv);
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.Message);
    }
}