使用哪个C#多线程选项
全部- 更多的问题。我有一个web服务,我需要从客户机对其进行性能测试。因此,本质上,我正在编写一个快速的WPF多线程应用程序(其中有一个仪表/速度计),以直观地指示请求/响应时间。事件驱动-因此,当我单击按钮时,应用程序将开始发出请求。我只关心请求/响应所花费的时间,而不是resposne值本身(目前) 以下是我目前的思考过程: 1) 我需要创建尽可能多的线程(我的客户机可以处理)并测量性能。我可以考虑两个选项-创建一个新的线程机制(这样我可以完全控制线程)或使用backgroundworker机制(这样我可以将该值从后台处理传递回UI)。假设-必须循环线程创建代码-因此可以继续为这两种方法创建多个线程 2) 不需要任何进度报告,因此这不是选择多线程方法的标准 3) 确实需要一个回调方法——因为它应该传回值(请求/响应Web服务所花费的时间) 4) 当我用一个值更新一个变量时-将利用任何一种可用的同步方法使用哪个C#多线程选项,c#,wpf,multithreading,C#,Wpf,Multithreading,全部- 更多的问题。我有一个web服务,我需要从客户机对其进行性能测试。因此,本质上,我正在编写一个快速的WPF多线程应用程序(其中有一个仪表/速度计),以直观地指示请求/响应时间。事件驱动-因此,当我单击按钮时,应用程序将开始发出请求。我只关心请求/响应所花费的时间,而不是resposne值本身(目前) 以下是我目前的思考过程: 1) 我需要创建尽可能多的线程(我的客户机可以处理)并测量性能。我可以考虑两个选项-创建一个新的线程机制(这样我可以完全控制线程)或使用backgroundworke
5)没有真正使用4框架中的任务API——但这是我应该考虑的东西。 上述方法看起来不错吗?还是我遗漏了什么
非常感谢您的帮助 很多人都推荐了任务,我认为这是个好主意。我自己也不介意使用裸线程,至于你应该使用哪一种,两者都可以。需要注意的主要问题是异常处理行为,这在两者之间有所不同。如果在一个典型的线程中有一个未处理的异常,它将导致进程停止,因此您可能希望有类似的异常(只是不要过于简化;): 另一方面,任务有一种更可控的处理错误的方法——当您调用Task.Wait函数时,它们会将错误封装在一个函数中 我特别考虑了您的情况下的异常,因为我假设您在压力测试期间会出现超时错误
Parallel.ForEach
可能也值得一看,但老实说,因为您正在尝试压力测试,而不是真实场景,我可能会避免它,以确定一次运行多少线程-我相信PLINQ东西在客户端做了一些负载平衡
回调方法对于所有这些方法都很容易。我只想使用方法调用,而不是传递回调,但这是一个实现细节
我会远离BackgroundWorker,因为它实际上是用于与UI相关的异步操作的,并且在这个特定的上下文中可能有点臃肿。是的,是的,任务再次是!任务是惊人的,有了任务,整个任务只是一个简单的PLINQ循环,创建webrequests并等待响应。@BenjaminGruenbaum+1 for PLINQ。我已经用过好几次了,它非常简单,非常适合做这类事情。完全同意@BenjaminGruenbaumYou应该发布一些代码,让人们知道你想做什么。然后,有人可以根据您使用Tasks API和PLINQ提供的内容给您一些示例代码。这将有助于未来的人与同样的问题。科里卢卢-我目前正在寻找方法的想法。我完全同意你的建议。似乎Tasks/PLINQ应该是首选选项-我只是想阅读它,并将在bitTasks中发布一个小POC。Tasks不仅仅是线程。埃里克·利珀特(Eric Lippert)在他的博客中多次明确表示了这一点。当您启动任务时,它可能不会启动线程(例如,它可能会使用事件)。例如,在HTTP请求的上下文中,基于事件的方法可能比基于线程的方法要好得多。这是值得了解的。您能提供参考吗?
int errorCount = 0;
void Run()
{
Thread t = new Thread(delegate()
{
try
{
// your code
}
catch (Exception )
{
Interlocked.Increment(ref errorCount);
}
});
}