Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进程结束前未完成的任务_C#_Multithreading_Asynchronous_Garbage Collection_Async Await - Fatal编程技术网

C# 进程结束前未完成的任务

C# 进程结束前未完成的任务,c#,multithreading,asynchronous,garbage-collection,async-await,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.DoSt

在主线程的代码中,我调用了第三方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;
     }
for(int i=0;i<1000;i++)
{
var demo=new asyncwaittest();
demo.DoStuff1(guid);
demo.DoStuff2(guid);
}
公共类异步测试
{
公共异步任务DoStuff1(字符串guid)
{
等待任务。运行(()=>
{
DoSomething1(guid);
});   
}
公共异步任务DoStuff2(字符串guid)
{
等待任务。运行(()=>
{
DoSomething2(guid);
});   
}
专用静态异步任务DoSomething1(字符串guid)
{
//插入db或其他内容
返回1;
}
专用静态异步任务DoSomething2(字符串guid)
{
//插入db或其他内容
返回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());

如果你想等待你所有的任务完成,你必须收集它们并等待它们。因为当你的过程结束时,通常一切都结束了

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


垃圾收集器不会杀死任务->如果它杀死了,那么我打赌任务的编码是“错误的”
我想当主线程完成时,垃圾收集器会杀死我在后台运行的所有其他任务。
这不是正常行为。代码不完整。您只创建了一些任务,但不启动或等待任何操作。这确实需要一个。请使您的代码更具可读性,很难读取此代码中的标识和括号你的意思是
main
thread吗?它是你的主进程线程吗?垃圾收集器不会杀死任务->如果是,那么我打赌任务的代码是“错误的”
我想当主线程完成时,垃圾收集器会杀死我在后台运行的所有其他任务。
这不是正常行为。代码不完整。您只创建了一些任务,但不启动或等待任何操作。这确实需要一个。请使您的代码更具可读性,很难读取此代码中的标识和括号你的意思是
main
thread吗?它是你的主进程线程吗?谢谢你的回答,这个解决方案能保证即使主线程提前完成任务也能运行吗?@TeO是和否。它保证主线程会等到所有其他线程都完成。因为如果进程结束,你的任务将无法保留。谢谢谢谢你的回复,关于你说我必须删除的第二部分,你能更具体一点吗?@TeO为了让你能够等待任务,你永远不能放弃它们。例如,调用一个方法返回一个任务…然后忽略结果。所有任务都必须等待。谢谢你的回复,这样,是吗e使用异步任务有什么原因吗?如果我调用所有同步任务,这是一样的吗?我使用异步是为了让主线程快速完成,这样,主线程将在所有异步任务完成后尽快完成,对吗?感谢您的回复,此解决方案是否保证即使主线程完成得更早,任务也会运行?@TeO是和否。它保证主线程将等待所有其他线程完成。因为如果进程结束,您的任务将无法保留。感谢您的回复,关于您说我必须删除的第二部分,您能更具体一些吗?@TeO要让您能够等待任务,您决不能放弃它们。例如calli正在禁用返回任务的方法…然后忽略结果。所有任务都必须等待。感谢您的回复,这样,是否有任何理由使用异步任务?调用所有同步任务是否相同?我使用异步是为了让主线程快速完成,这样,主线程将在所有异步任务完成后尽快完成讨厌,对吧?