我的代码是这样的:
static void Main(string[] args)
{
var taskList = new List<Task>();
for (int i = 0; i < 100; i++)
{
var ii = i;
taskList.Add(Task.Run(() =>
{
Do(ii);
}));
}
Task.WaitAll(taskList.ToArray());
Console.WriteLine("全部结束");
Console.ReadKey();
}
/// <summary>
/// 模拟玩家请求
/// </summary>
/// <param name="gid"></param>
public static void Do(int id)
{
var sw = Stopwatch.StartNew();
Console.WriteLine($"{id}开始");
//这样是请求服务器的代码,有N个http请求,运行时间大概是4秒
Console.WriteLine($"{id}结束,耗时:{sw.ElapsedMilliseconds}毫秒");
}
现在的问题是控制台输出的“xx开始”是断断续续的,不应该是刷的一下子瞬间输出100条吗?现在这样就无法模拟100个用户同时并发请求了。
仅供参考
void Main()
{
foreach(var p in Enumerable.Range(1,100))
{
Do(p);
}
}
async void Do(int id)
{
var sw = Stopwatch.StartNew();
Console.WriteLine($"{id}开始");
await Task.Delay(4000);
//这样是请求服务器的代码,有N个http请求,运行时间大概是4秒
Console.WriteLine($"{id}结束,耗时:{sw.ElapsedMilliseconds}毫秒");
}
为什么要加await Task.Delay(4000);这句代码
@拖鞋王子: 这句代码是模拟你请求服务器的方法。使用异步请求可以尽快让出线程资源。
如果你用的同步请求,Task.Run方法应该会在线程池中开一个后台任务,在他执行完之前,这个线程都是忙碌状态,然后你模拟并发的时候,4秒内就要开100个线程池线程,线程池开新线程速度有限,也就每秒两个左右,所以你的输出是断断续续的,因为在等线程池创建新线程。
使用异步方法则是,运行到await的时候,就会让出线程,新的请求不需要等待线程创建。这种情况下,就可以看到瞬间输出100条开始信息,大约4秒厚,瞬间输出100条结束信息。
@拓拓: xx开始确实是一瞬间输出了但是Task.Delay后面的代码还是断断续续的,比如在Task.Delay后面加一句 Console.WriteLine($"{id}开始222");所以还是不能达到我的目的
Parallel 可以了解一下
线程创建,启动也是要时间的,100个线程线程池一下子也提供不了这么多。
试试先把所有Task创建起来,然后再集体Run。
可以找一些测试工具来完成这类工作。试试 JMeter
用测试用具的话请求参数只能是固定的吧,我现在的需求是后面的请求的参数是要分析前面的请求返回的数据而定的