2013-03-14 47 views
2

全部 -其中C#多线程选项使用

更多的方法问题。我有一个Web服务,我需要从客户端机器进行性能测试。所以本质上我正在编写一个快速的WPF多线程应用程序(里面有一个量表/速度表)来直观地表示请求/响应时间。事件驱动 - 所以当我点击一个按钮 - 应用程序将开始提出请求。我只关心请求/响应花了多少时间,而不是现在的resposne值本身。

这是我目前思考的过程:

1)我需要创建尽可能多的线程,我可以(这我的客户机可以处理),并衡量性能。 2个选项我可以考虑 - 创建一个新的Thread机制(所以我可以完全控制该线程)或使用backgroundworker机制(这样我可以将该值从后台处理传递回UI)。假设 - 将不得不遍历线程创建代码 - 因此可以为这两种方法创建多个线程。

2)不需要任何进展报告,因此这不是标准用于选择多线程方式

3)是否需要一个回调方法 - 因为这应该传回的值(取为请求时间/响应web服务)

4)当我更新一个值的变量 - 将利用任何一种可用的同步方法。

5)没有真正使用4.0框架中的任务API - 但那是我应该考虑的。

上述方法看起来不错吗?或者我错过了什么吗?

真的很感谢任何帮助!

+4

是的,是的,是再一次的任务!任务是惊人的,整个任务的任务只是一个简单的PLINQ循环,创建webrequests并等待响应。 – 2013-03-14 17:38:02

+0

@BenjaminGruenbaum +1 PLINQ。我已经在几次使用它,这对于这类事情来说是非常容易和很棒的。 – 2013-03-14 17:40:27

+0

完全同意@BenjaminGruenbaum – 2013-03-14 17:40:55

回答

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相关的异步操作,并且在这个特定的上下文中可能有点臃肿。

+1

任务不仅仅是线程。 Eric Lippert在他的博客中多次表达了这一点。当你启动一个任务时,它可能不会触发一个线程(例如,它可能会使用一个事件,例如,在HTTP请求的上下文中,基于事件的方法可能比基于线程的方法好得多 – 2013-03-14 20:55:09

+0

这值得了解。你能提供参考吗? – 2013-03-14 21:06:09