任务未在流程结束前完成

时间:2017-11-23 11:00:18

标签: c# multithreading asynchronous garbage-collection async-await

在主线程的代码中,我调用了第三方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;
     }

由于

1 个答案:

答案 0 :(得分: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());

你也有 2 级别的疏忽(意味着你开始一项任务而不关心它是否已经完成)。你也需要删除第二个:

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