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