【问题标题】:Task vs async Task when running multiple task in background [duplicate]在后台运行多个任务时的任务与异步任务[重复]
【发布时间】:2018-11-25 04:53:51
【问题描述】:

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

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

有什么区别?

【问题讨论】:

  • 1. Task.Run(() =&gt; DoSomeAsyncStuff("a")); 将阻止执行 - 它不应该阻止执行。无论调用结果如何,Main 都会继续执行。
  • 你确定最后一条评论吗,@Fabio?您不会将状态机与同步上下文混淆吗?
  • @PauloMorgado,StateMachine,谢谢

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


【解决方案1】:

async 关键字将指示编译器构建一个状态机,该状态机是方法执行流程的开头和第一个 await 之间的代码,任何两个连续的 awaits 之间的代码和最后await 和方法的返回。

如果你不关心结果或者方法完成(注意这一点),方法的返回类型是void,如果你想等待方法的执行但不要'Task如果您想等待方法的执行并返回T 类型的值,则不想返回任何值或Task&lt;T&gt;

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

【讨论】:

猜你喜欢
  • 2016-10-27
  • 1970-01-01
  • 2016-03-02
  • 2018-07-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多