【问题标题】:Tasks not finishing before process end流程结束前未完成的任务
【发布时间】:2018-05-07 07:49:34
【问题描述】:

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

谢谢

【问题讨论】:

  • 垃圾收集器不会杀死任务 -> 如果确实如此,那么我敢打赌任务被编码为“错误”
  • i suppose that when main Thread finish, garbage collector kills all my other tasks that run in background. 这不是正常行为。
  • 代码不完整。你只创建了一些任务,但你没有开始或等待任何东西。这确实需要minimal reproducible example
  • 请让您的代码更具可读性,标识和括号很难阅读此代码
  • main 线程是什么意思?它是你的主进程线程吗?

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


【解决方案1】:

如果您想等待所有任务完成,则必须收集它们并等待它们。因为当您的流程结束时,这通常是一切的结束。

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);
}

【讨论】:

  • 感谢您的回复,这个方案能保证即使主线程提前完成,任务也会运行?
  • @TeO 是也不是。它保证主线程将等待,直到所有其他线程都完成。因为如果流程结束,您将无法保留您的任务。
  • 谢谢你的回复,关于你说我必须删除的第二部分,你能更具体吗?
  • @TeO 为了让你能够等待任务,你绝不能放弃它们。例如调用返回任务的方法......然后忽略结果。所有任务都必须等待。
  • 谢谢你的回复,这样的话,有什么理由使用异步任务吗?如果我调用所有同步,它是一样的吗?我使用异步是为了让主线程快速完成,这样主线程就会在所有异步任务完成后立即完成,对吧?
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
相关资源
最近更新 更多