Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同时多次调用api的最佳方法是什么?_C#_.net_Multithreading - Fatal编程技术网

C# 同时多次调用api的最佳方法是什么?

C# 同时多次调用api的最佳方法是什么?,c#,.net,multithreading,C#,.net,Multithreading,我想同时调用一个API,例如,用户将输入要模拟的客户端数量,例如10个。然后我想同时模拟10个api调用 最好的方法是什么 你可以 void Main() { var sw = new Stopwatch(); Console.WriteLine("For really parallel, operation should take about 1 second"); Console.WriteLine("ReallyParallel"); sw

我想同时调用一个API,例如,用户将输入要模拟的客户端数量,例如10个。然后我想同时模拟10个api调用

最好的方法是什么

你可以

void Main()
{
    var sw = new Stopwatch();   

    Console.WriteLine("For really parallel, operation should take about 1 second");

    Console.WriteLine("ReallyParallel");    
    sw.Start(); 
    ReallyParallel();
    sw.Stop();  
    Console.WriteLine($"ReallyParallel for {sw.Elapsed}");

    Console.WriteLine("NotReallyParallel_TPL");
    sw.Restart();   
    NotReallyParallel_TPL();    
    sw.Stop();
    Console.WriteLine($"NotReallyParallel_TPL for {sw.Elapsed}");

    Console.WriteLine("NotReallyButGoodOne");
    sw.Restart();   
    NotReallyButGoodOne();
    sw.Stop();
    Console.WriteLine($"NotReallyButGoodOne for {sw.Elapsed}");
}
如果你想打很多电话,就用这个

void NotReallyButGoodOne()
{
    var tasks = new List<Task>();
    for (var i = 0; i < 10; i++)
    {
        tasks.Add(Task.Run(() => CallAPI()));
    }

    Task.WaitAll(tasks.ToArray());
}
如果你想打几个电话,可以使用这个方法(这实际上是并行的,但可能效率很低)


一个非常广泛的问题。然而,使用Parallel.ForEach或来自TPL的其他东西来实现这类功能是很常见的。基本上,我有一个调用api的函数,我想执行用户想要执行多少次的函数。我不想一个接一个地运行,而是应该能够并行运行。我尝试了并行。但操作类型应为INT。这将是并行的解决方案,但同步如何,如果我花时间,它将是不同的。添加的计时,您可以检查它。不感兴趣,为什么您将
并行分类。对于
为“不是真正的并行”?@stuartd,因为它取决于并行设置。默认情况下,它自行决定何时运行单独的操作,如果您尝试同时启动100个操作,则只有几个操作将并行运行,其他操作将等待上一个操作完成。如果用户输入1000,在这种情况下,将创建1000个线程或1000个任务,哪个方法将有效
void NotReallyParallel_TPL()
{
    Parallel.For(1, 10, i => CallAPI());
}
void ReallyParallel()
{
    var threads = new List<Thread>();
    for (var i = 0; i < 10; i++)
    {
        var t = new Thread(() => CallAPI());
        t.Start();
        threads.Add(t);
    }

    foreach (var t in threads)
    {
        t.Join();
    }
}
void CallAPI()
{
    // callig stuff
    Thread.Sleep(1000);
    Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}");
}