C# 异步操作,我做错了。。。为什么?

C# 异步操作,我做错了。。。为什么?,c#,asynchronous,httpclient,C#,Asynchronous,Httpclient,同步代码: public static void ImportData() { for (var i = 0; i < 40000; i++) { DoSomething(i) } } 异步代码: public static void ImportDataAsync() { for (int i = 0; i < 40000; i++) { await DoSomething(i) } } 要明确的

同步代码:

public static void ImportData()
{

    for (var i = 0; i < 40000; i++)
    {
        DoSomething(i)
    }
}
异步代码:

public static void ImportDataAsync()
{
    for (int i = 0; i < 40000; i++)
    {
        await DoSomething(i)
    }
}
要明确的是,这是我第一次尝试异步操作

对于异步代码,我的软件速度非常慢,如果我同步运行多个命令行应用程序实例,速度会快10倍

我的意思是,我不认为DB访问和GetAsync函数的try/catch块会造成这两种方法之间的巨大差异,你认为呢

编辑:我不知道如何改进这个问题,但我会尝试给出答案

我所要求的是Parallel.Foreach方法,我所做的是认为wait前缀会将当前线程设置为备用,创建另一个线程并继续for循环,相反,wait所做的只是将该方法保留到等待的结果,然后,他在for循环的同一点返回,并在等待的地方重新开始


我只是把事情弄糊涂了,特别是在一个控制台应用程序中,实际上我看不到任何使用wait/async的好理由。

第一次阅读时,可能是这样吗?20000对100000次迭代

// Sync version
var start = 4000000;
var end = start + 20000;

// Async version
var start = 4000000;
var end = start + 100000
在异步方法中,我还看到了一些东西:

public static void ImportAsyncData应为public static async Task ImportAsyncData,以便调用方等待您的操作

var slot=gs.GetAsyncc;我认为您需要等待该调用:var slot=await gs.GetAsyncc;这样,您就不必使用ContinueWith,因为您的GetAsync调用正在等待,所以只有在或GetAsync任务完成时,才会执行下一行代码

您不应该像这样忙着等待:当requestDid-requestDone>100;,您正在使用CPU等待。在这种情况下,您可以在任务之间使用一个关于并发性的共享变量,可能使用一些简单的锁逻辑

您可以将其重构为类似这样的内容,但我不太明白您想要实现什么以及您的问题是什么:-

public async Task ImportAsyncData()
{
    var gs = new Site();

    int requestDid = 0;
    int requestDone = 0;
    var found = 0;

    var watch = System.Diagnostics.Stopwatch.StartNew();
    var start = 4000000;
    var end = start + 100000

    var cod = "user"

    for (int i = start; i < end; i++)
    {
        var ts = watch.Elapsed;
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);

        Console.Title = "R: " + (i - start) + " F: " + found + " EL: " + ts;

        var c = cod + i;

        var user = await gs.GetAsync(c);
        if (user == null)
        {
            requestDone++;
            return;
        }

        using (var db = new Database())
        {
            found++;
            db.InsertUser(user);
        }

        requestDid++;
    }
}

如果没有一个可靠地再现问题的好答案,也许我们就无法回答。但是,一些观察结果表明:快速版本的工作效率似乎是慢速版本的五分之一。这将导致5倍的差异。此外,慢速版本似乎允许多达100个并发操作,这可能会产生大量争用,除非两端都有100个CPU和一个真正快速的网络。除此之外,您还使用旋转等待来实现节流,这意味着您在等待时100%占用了一个CPU内核,这只会使其他一切变得更慢。事实是,如果您的机器上只有两个CPU内核,而慢速版本的工作量实际上是原来的5倍,而操作的大部分成本都是本地计算,上述观察结果可以完全解释10倍的差异。如果没有,那么…你仍然需要解决这个问题,以便它包括一个好的,供任何人诊断你的问题。可以说,在这种情况下,正确地执行异步不会以任何明显的方式影响性能,当然不会有10倍的差异。我们怎么知道您为什么做错了?也许只是因为你不是很好?也许你想问这是怎么回事?我仍在学习,对异步世界仍有点困惑,但我相信使用异步代码的主要目标不是让事情变得更快,而是在进行同步时不阻塞UI线程。您可以同时运行数千个Get请求,最终,您将遇到一些限制—网络、服务器、线程池等等。虽然你可能认为并行运行应该会让事情运行得更快,但实际上可能会产生相反的效果想想管理所有任务所需的所有工作等等…我看到的并不是执行的总时间,而是速度非常慢,我在for循环中看到了这一点,当使用同步版本时,他喜欢每秒5个请求,在异步版本中,他每秒1/2个请求,然后在等待请求完成的冻结之后,他再次启动。关于异步方法,我不希望调用方必须等待我的操作,这并不重要。2.如果我等待请求完成,循环是否会停止直到完成?3.你是什么意思?我可以举一些例子吗?我认为首先您应该阅读一些文档,对Async/Await有一些经验。这些资源可能很有用:,