C# 在后台运行多个任务时任务与异步任务

C# 在后台运行多个任务时任务与异步任务,c#,.net,multithreading,async-await,task,C#,.net,Multithreading,Async Await,Task,线程同步对我来说并不重要。我只是想了解是否有任何具体的区别。 有人能回顾一下这段代码并给我一些想法吗。所有的方法都是在后台执行的 第一部分 在程序DoSomeAsyncStuff中,当删除async时,则 Task.Run=>DoSomeAsyncStuffa;将阻止执行,所以我需要异步 将DoSomeAsyncStuff与DoSomeAsyncStuffV2进行比较,一次实现是否优于另一次实现? 更新:让我们关注 第二部分 私有异步任务的区别是什么。。vs私人任务做。。 基于此,我认为可能

线程同步对我来说并不重要。我只是想了解是否有任何具体的区别。 有人能回顾一下这段代码并给我一些想法吗。所有的方法都是在后台执行的

第一部分

在程序DoSomeAsyncStuff中,当删除async时,则

Task.Run=>DoSomeAsyncStuffa;将阻止执行,所以我需要异步

将DoSomeAsyncStuff与DoSomeAsyncStuffV2进行比较,一次实现是否优于另一次实现?

更新:让我们关注

第二部分

私有异步任务的区别是什么。。vs私人任务做。。 基于此,我认为可能没有,但如果您查看这两种方法的实现,一种方法正在等待任务完成,另一种方法正在返回任务

public class ServiceX
{
    public Task SomeServiceEntryMethod()
    {
        Console.WriteLine("Multithreading started");
        Thread.Sleep(1);

        List<Task> tasks = new List<Task>();
        for (int i = 0; i < 8; i++)
        {
            //I can use this version 
            //var t = DoSomeAsyncStuff(i.ToString());       

            //or I can use this version both seems to have same results
            var t = DoSomeAsyncStuffV2(i.ToString());
            tasks.Add(t);
        }
        //in the calling method I can await for all task to complete the for loop spins a few async tasks
        return Task.WhenAll(tasks); 
    }

    private async Task DoSomeAsyncStuffV2(string text)
    {
        await Task.Run(() =>
        {
            if (text == "0")
                Thread.Sleep(1000);
            Console.WriteLine("test " + text + " " + Thread.CurrentThread.ManagedThreadId.ToString());

        });
    }

    private Task DoSomeAsyncStuff(string text)
    {
        return Task.Run(() =>
        {
            if (text == "0")
                Thread.Sleep(1000);
            Console.WriteLine("test " + text + " " + Thread.CurrentThread.ManagedThreadId.ToString());

        });
    }
}

class Program
{
    public static async Task Main(string[] args)
    {
        //Task.Run(() => DoSomeAsyncStuff("a"));
        //Task.Run(() => DoSomeAsyncStuff("b"));

        //DoSomeAsyncStuffV2("c");
        //DoSomeAsyncStuffV2("d");
        ServiceX x = new ServiceX();
        await x.SomeServiceEntryMethod();
    }

    //private static async void DoSomeAsyncStuff(string text)
    //{
        //Console.WriteLine("test " + text + " " + Thread.CurrentThread.ManagedThreadId.ToString());
    //}

    //private static async void DoSomeAsyncStuffV2(string text)
    //{
        //await Task.Run(() => Console.WriteLine("test " + text + " " + Thread.CurrentThread.ManagedThreadId.ToString()));
    //}
}
有什么区别? async关键字将指示编译器构建一个状态机,该状态机是方法执行流开始与第一次等待之间的代码、任意两次连续等待之间的代码以及最后一次等待与方法返回之间的代码

如果不关心结果,或者如果方法完成,则返回类型为void;如果要等待方法执行,则返回类型为Task;如果要等待方法执行,则不返回任何值;如果要等待方法执行,则返回类型为t的值,则返回类型为Task


如果该方法没有异步修饰符,那么它只是一个普通方法。

1。Task.Run=>DoSomeAsyncStuffa;将阻止执行-它不应该阻止执行。无论调用结果如何,Main都将继续执行。您确定最后一条评论@Fabio吗?你是不是把状态机和同步上下文搞混了?@PauloMorgado,它是状态机,谢谢。但是私有任务DoSomeAsyncStuff没有async关键字并运行async,所有方法都在线程休眠的text==0之前完成。我假设您引用了任何类型不同于task的方法不,它没有!它调用运行异步的东西并返回表示该任务的任务。它确实调用了,我为您做了证明不,它没有,您什么也没有证明: