全部 -
更多的方法问题。我有一个Web服务,我需要从客户端机器进行性能测试。因此,本质上我正在编写一个快速的WPF多线程应用程序(其中包含一个仪表/速度计),以直观地指示请求/响应时间。事件驱动 - 所以当我点击一个按钮 - 应用程序将开始发出请求。我只担心请求/响应花了多少时间而不是resposne值本身(现在)。
这是我目前的思考过程:
1)我需要创建尽可能多的线程(我的客户端机器可以处理)并测量性能。我可以考虑2个选项 - 创建一个新的Thread机制(所以我可以完全控制线程)或使用backgroundworker机制(所以我可以将该值从后台处理传递回UI)。假设 - 将不得不遍历线程创建代码 - 因此可以继续为两种方法创建多个线程。
2)不需要任何进度报告,因此这不是选择多线程方法的标准
3)需要一个回调方法 - 因为它应该传回值(请求/响应web服务所花费的时间)
4)当我使用值更新变量时 - 将利用任何一种可用的同步方法。
5)没有真正使用4.0框架中的Task API - 但这是我应该考虑的事情。
上述方法是否看起来很好 - 或者我错过了什么?
非常感谢任何帮助!!!
答案 0 :(得分:1)
我想很多人都推荐过任务,这是一个好主意。我不介意自己使用裸线,至于你应该使用哪一个,要么会做得很好。需要注意的主要问题是异常处理行为,它在两者之间有所不同。如果你在一个典型的线程中有一个未处理的异常,它会降低你的进程,所以你可能想要这样的东西(只是没有过分简化;)):
int errorCount = 0;
void Run()
{
Thread t = new Thread(delegate()
{
try
{
// your code
}
catch (Exception )
{
Interlocked.Increment(ref errorCount);
}
});
}
另一方面,任务具有更可控的处理错误的方式 - 当你调用Task.Wait函数时,它们将它们包装在AggregateException中。
我正在考虑针对您的案例的例外,因为我认为在压力测试期间您最终会出现超时错误。
Parallel.ForEach
也许值得一看,但老实说,既然你正在尝试压力测试而不是现实世界的场景,我可能会避免它确定我在运行多少个线程曾经 - 我相信PLINQ的东西在客户端做了一些负载平衡。
所有这些方法都很容易使用回调方法。我只是使用方法调用,而不是传递回调,但这是一个实现细节。
我会远离BackgroundWorker,因为它真的意味着与UI相关的异步操作,并且在这个特定的上下文中可能有点臃肿。