使用多线程完成另一个方法时启动方法

时间:2017-01-10 14:49:17

标签: c# .net multithreading

我正在寻找一种方法来在另一个方法完成后立即启动方法。所以这就是这个想法:

第一个Parallel.Invoke将会开始,例如,GetGroups()完成后,我想开始InsertGroup(),之后Insert_EventGroups()

Parallel.Invoke(() => { GetGroup(); },
                () => { GetProfile(); });

Parallel.Invoke(() => { InsertGroup(); },
                () => { InsertProfile(); });

Parallel.Invoke(() => { Insert_EventGroups(); },
                () => { Insert_GroupProfiles(); });

我该怎么做?

2 个答案:

答案 0 :(得分:4)

只需按顺序调用它们,如果你想为组和配置文件进行多线程,你可以执行类似下面的操作(将方法重命名为更合适的方法):

Parallel.Invoke(() => { GroupStuff(); },
                () => { ProfileStuff(); });

void GroupStuff()
{
    GetGroup();
    InserGroup();
    Insert_EventGroups();
}

void ProfileStuff()
{
    GetProfile();
    InserProfile();
    Insert_GroupProfiles();
}

答案 1 :(得分:3)

如果这些方法是非任务返回,那么正确的方法是简单地按照你想要的顺序。默认情况下, C#将按顺序执行,因此方法调用的顺序是它们执行的顺序。

private void PerformGroupUpdate()
{
    GetGroup();
    InsertGroup();
    Insert_EventGroups();
}

private void PerformProfileUpdate()
{
    GetProfile();
    InsertProfile();
    Insert_GroupProfiles();
}

如果您使用Parallel.Invoke,它将并行运行这些方法,而不一定保持顺序。所以你现在可以调用上面的两个执行方法来按你认为合适的方式执行它们。此外,如果您希望它们同时运行,可以通过使用Parallel.Invoke并传递这两种新方法来实现。

Parallel.Invoke(() => PerformGroupUpdate(), () => PerformProfileUpdate()); 

如果这些方法是async方法,那么您可以使用Task.WhenAll

private async Task PerformGroupUpdateAsync()
{
    await GetGroup();
    await InsertGroup();
    await Insert_EventGroups();
}

private async TaskPerformProfileUpdateAsync()
{
    await GetProfile();
    await InsertProfile();
    await Insert_GroupProfiles();
}

private async Task InvokeAllAsync() 
    => await Task.WhenAll(PerformGroupUpdateAsync(), TaskPerformProfileUpdateAsync());