2017-01-10 4 views
2

別のメソッドが終了するとすぐにメソッドを開始する方法を探しています。だから、これはアイデアです:マルチスレッドを使用して別の方法が終了したときにメソッドを開始する

第一Parallel.Invokeは、私がInsertGroup()とそのInsert_EventGroups()後を開始したいと思い行われているとすぐに例GetGroups()用として、スタートします。

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

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

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

どうすればいいですか?

+5

各メソッドを順番に呼び出すだけのタスクを実行するだけではどうですか。 –

+1

もし 'Task'を使っていたら、' .ContinueWith' APIを使うことができます。 –

+0

私は@Matthew Watsonに同意します。なぜあなたはここでもスレッドを必要としますか?メソッドを1つずつ呼び出す場合は、順番に呼び出します。 – coolboyjules

答えて

3

これらのメソッドが非タスク返却である場合、適切な方法は、希望する順序で単純にそれらを配置することです。既定ではC#が順番に実行されるので、メソッド呼び出しの順序は実行される順序になります。

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

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

あなたはそれが並行してこれらのメソッドを実行して、必ずしも順序を保持しないでしょうParallel.Invokeを使用した場合。したがって、上記の2つのメソッドを実行して、適切に実行することができます。さらに、それらを同時に実行したい場合は、Parallel.Invokeを使用してこれらの2つの新しいメソッドを渡すことで実現できます。

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()); 
+0

これは、操作の各収集に固有の操作が順次である必要がある場合でも、グループとプロファイルを同時に処理することを許可しません。 – Servy

4

ちょうどあなたがグループのために、マルチスレッドをしたいとプロファイル場合は、以下の(名前変更のような何かを行うことができ、順次それらを呼び出しますより適切なものへのメソッド):

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

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

void ProfileStuff() 
{ 
    GetProfile(); 
    InserProfile(); 
    Insert_GroupProfiles(); 
} 
関連する問題