0

メインスレッドの私のコードで私はサードパーティAPIを呼び出します。 APIの結果ごとに、私は2つの非同期タスクを呼び出します。場合によってはすべてが完璧に動作することもあります。メインスレッドが終了すると、ガベージコレクタはバックグラウンドで実行される他のすべてのタスクを強制終了します。メインスレッドが終了したときにガベージコレクタにバックグラウンドサービスを強制終了させないように指示する方法はありますか?タスクがプロセス終了前に終了していない

コードはこのようなものです:あなたが完了するすべてのタスクを待ちたい場合

for (int i = 0; i < 1000; i++) 
{ 
    var demo = new AsyncAwaitTest(); 
    demo.DoStuff1(guid); 
    demo.DoStuff2(guid); 
} 

public class AsyncAwaitTest 
{ 
    public async Task DoStuff1(string guid) 
    { 
     await Task.Run(() => 
     { 
      DoSomething1(guid); 
     }); 
    } 

    public async Task DoStuff2(string guid) 
    { 
     await Task.Run(() => 
     { 
      DoSomething2(guid); 
     }); 
    } 

    private static async Task<int> DoSomething1(string guid) 
    { 
     // insert in db or something else 
     return 1; 
    } 

    private static async Task<int> DoSomething2(string guid) 
    { 
     // insert in db or something else 
     return 1; 
    } 

おかげ

+3

ガベージコレクタがタスクを殺さない - >それは、私は賭けタスクが、私はそのメインスレッド仕上げ、ガベージコレクタのキルを想定 ' – EpicKip

+2

「間違った」コード化されない場合すべての私の他のタスクはバックグラウンドで実行されます。これは正常な動作ではありません。 – Stefan

+4

コードが不完全です。いくつかのタスクを作成するだけですが、何も開始したり待ったりしません。これには本当に[mcve]が必要です。 –

答えて

2

、あなたはそれらを収集し、それらを待たなければなりません。プロセスが終了すると、通常はすべてが終了します。

var tasks = List<Task>(); 

for (int i = 0; i < 1000; i++) 
{ 
    var demo = new AsyncAwaitTest(); 
    tasks.Add(demo.DoStuff1(guid)); 
    tasks.Add(demo.DoStuff2(guid)); 
} 

// before your process ends, you need to make sure all tasks ave finished. 
Task.WaitAll(tasks.ToArray()); 

また、(あなたがタスクを開始し、それに行うのかどうか気にしないという意味)不注意のレベルを持っています。あなたも、二番目を削除する必要があります。

public async Task DoStuff1(string guid) 
{ 
    await DoSomething1(guid); 
} 
+0

このソリューションは、タスクがメインスレッド早く終わる? – TeO

+0

@TeOはい、いいえ。メインスレッドは他のスレッドが終了するまで**待機する**ことを保証します。プロセスが終了した場合、タスクを維持する方法がないためです。 – nvoigt

+0

あなたの返事をありがとう、私が削除する必要があると言う2番目の部分については、より具体的なことができますか? – TeO

関連する問題