针对 C# 异步的秒表:我是否被秒表愚弄了,或者那里有什么我不知道的东西?



基本上,我想停止对Google BigQuery的异步API调用。我打算在两种模式下设计测试运行:(1)单线程模式——调用API,等待它完成任务,然后触发下一个调用。(2)多线程模式——通过Task启动多个调用。跑,然后等他们全部跑完。根据秒表,测试结果很混乱。在第一种模式下,每个API调用在大约300ms内完成任务,但在第二种模式下,除了最初的几个调用外,每个API调用都需要10秒以上的时间。这是一个巨大的差异!(Windows 8.1 Pro, 8GB内存,2核CPU)

它可能是Google BigQuery方面的东西,但除了这种可能性,我想确保我正确地使用秒表,或者我的意思是我正在测量我想要测量的东西。我是吗?

代码如下:

 static void Main(string[] args)
    {
       // SingleThreadMode();
        MultiThreadMode();
    }
 private static void SingleThreadMode()
    {
        var batch = ReadOneBatchInArrays();
        for (int i = 0; i < 100; i++)
        {
            try
            {
                Task.Run(async () => { await InsertAsync("T20150624", batch, InsertId); }).Wait(-1);
            }
            catch (AggregateException e)
            {
                foreach (var exception in e.InnerExceptions)
                {
                    Console.WriteLine(exception);
                }
            }
        }
        Console.WriteLine("End");
        Console.ReadLine();
    }
private static void MultiThreadMode()
    {
        var batch = ReadOneBatchInArrays();
        IList<Task> tasks = new List<Task>();
        for (int i = 0; i < 100; i++)
        {
            try
            {
                tasks.Add(Task.Run(async () => { await InsertAsync("T20150624", batch, InsertId); }));
            }
            catch (AggregateException e)
            {
                foreach (var exception in e.InnerExceptions)
                {
                    Console.WriteLine(exception);
                }
            }
        }
        Task.WaitAll(tasks.ToArray(),-1);
        Console.WriteLine("End");
        Console.ReadLine();
    }

秒表在InsertAsync:

Stopwatch stopwatch = Stopwatch.StartNew();
TableDataInsertAllResponse response = await BqService.Tabledata.InsertAll(request, ProjectId, DatasetId, tableId).ExecuteAsync(); 
stopwatch.Stop();
Logger.Trace("BigQuery.InsertAll#Back|row count|milliseconds~{0}~{1}", rowList.Count, stopwatch.ElapsedMilliseconds);

非常感谢下面的回答。我最后在我的app.config中添加了几行,它解决了这个问题。

<system.net>
<connectionManagement>
    <add address="*" maxconnection="2000" />
</connectionManagement>
</system.net>

你很可能遇到。net的并发连接限制,如这个问题所示:最大并发httpwebrequest数。

对单个主机的最大并发请求数是有限的。因此,发生的情况是,前两个请求立即通过,但是一旦达到限制,后两个请求开始阻塞并等待,直到第一个请求完成。

相关内容

最新更新