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

时间:2018-11-25 04:53:52

标签: c# .net multithreading async-await task

线程同步对我而言并不重要。我只想了解是否有任何具体区别。 因此有人可以查看此代码并给我一些想法。所有方法都在后台执行,只是

第1部分。

在程序DoSomeAsyncStuff()中,先删除async,然后

Task.Run(() => DoSomeAsyncStuff("a"));将阻止执行,因此我需要异步

DoSomeAsyncStuffDoSomeAsyncStuffV2进行比较是否曾经是实现的首选?

更新:让我们专注于

第2部分。

private async Task Do..()private Task Do..()有什么区别 基于此https://stackoverflow.com/a/48392684/1818723,我认为可能没有,但是如果您同时看两种方法的实现,一个正在等待任务完成,另一个正在返回任务

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

有什么区别? enter image description here

1 个答案:

答案 0 :(得分:-1)

async关键字将指示编译器构建状态机,该状态机应为方法执行流的开头与第一个await之间的代码,这是任意两个连续的{{1 }}之间,以及最后一个await与方法的返回之间。

如果您不关心结果或方法完成(请注意),则方法的返回类型为await,如果要等待执行方法的返回类型为void。方法,但不想返回任何值;如果要等待该方法的执行并返回类型为Task的值,则不想返回Task<T>

如果该方法没有T修饰符,则它只是一个“常规”方法。

相关问题