Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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#多线程选项_C#_Wpf_Multithreading - Fatal编程技术网

使用哪个C#多线程选项

使用哪个C#多线程选项,c#,wpf,multithreading,C#,Wpf,Multithreading,全部- 更多的问题。我有一个web服务,我需要从客户机对其进行性能测试。因此,本质上,我正在编写一个快速的WPF多线程应用程序(其中有一个仪表/速度计),以直观地指示请求/响应时间。事件驱动-因此,当我单击按钮时,应用程序将开始发出请求。我只关心请求/响应所花费的时间,而不是resposne值本身(目前) 以下是我目前的思考过程: 1) 我需要创建尽可能多的线程(我的客户机可以处理)并测量性能。我可以考虑两个选项-创建一个新的线程机制(这样我可以完全控制线程)或使用backgroundworke

全部-

更多的问题。我有一个web服务,我需要从客户机对其进行性能测试。因此,本质上,我正在编写一个快速的WPF多线程应用程序(其中有一个仪表/速度计),以直观地指示请求/响应时间。事件驱动-因此,当我单击按钮时,应用程序将开始发出请求。我只关心请求/响应所花费的时间,而不是resposne值本身(目前)

以下是我目前的思考过程:

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

2) 不需要任何进度报告,因此这不是选择多线程方法的标准

3) 确实需要一个回调方法——因为它应该传回值(请求/响应Web服务所花费的时间)

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

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);
        }
    });
}