c# - 带秒表的线程安全方法

标签 c# multithreading timer

我正在尝试确定我使用的代码是否是线程安全的。我基本上是尝试从不同的线程多次调用一个方法,并捕获方法内某些调用完成所需的时间。

这是我正在做的事情的一个例子。

using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace ThreadTest
{
class Program
{
    static BlockingCollection<TimeSpan> Timer1 = new BlockingCollection<TimeSpan>(new ConcurrentBag<TimeSpan>());

    static TimeSpan CaptureTime(Action action)
    {
        Stopwatch stopwatch = Stopwatch.StartNew();
        action();
        stopwatch.Stop();
        return stopwatch.Elapsed;
    }

    static void ThreadFunction()
    {
        TimeSpan timer1 = new TimeSpan();
        timer1 = CaptureTime(() =>
            {
                //Do Some Work
            });
        Timer1.Add(timer1);
    }

    static void Main(string[] args)
    {
        for (int i = 0; i < 50; i++)
        {
            var task = new Task(ThreadFunction);
            task.Start();
        }
    }
}

}

我想要确定的是 CaptureTime 方法返回的 TimeSpan 值是否可信。

感谢所有能够启发我的人。

最佳答案

使用Stopwatch这不是问题所在。看这个recent answer 。由于使用秒表时处于单线程中,因此它可以正常工作。

但我不确定这种方法是否真的非常有用。您是否想创建自己的分析器?为什么不直接使用现有的分析工具?

当您启动同一操作的 50 个实例时,它们必然会争夺相同的 CPU 资源。另外,一个新的Task可能会也可能不会启动新线程。即便如此,所涉及的转换量也会使结果变得没有意义。除非您专门尝试观察并行行为,否则我会避免这种方法。

更好的方法是按顺序运行该操作 50 次,对整个过程进行计时,然后除以 50。(假设这是一个短期运行的任务。)

使用BlockingCollection<TimeSpan>(new ConcurrentBag<TimeSpan>())也很奇怪。由于您只是添加到列表中,并且它是静态的且预先创建的,因此您可以只使用 List<TimeSpan> 。请参阅 List<T> 中有关线程安全的注释。文档 here .

忽略这一点。我误解了文档的上下文。你的代码很好,而且确实是线程安全的。感谢 Jim 和 Alexi 解决了这个问题。

关于c# - 带秒表的线程安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18646376/

相关文章:

c# - visual studio 在控制台应用程序而不是 Web 项目中打开 Web 浏览器 + 调试器

c# - 如何在 .NET 中订阅特定的网络适配器连接事件

python - python中有两个或多个工作队列

C++ OpenGL Pong 球移动得太快

java - 在计时器完成或取消后运行代码

c# - OnResume() 在 Xamarin Droid 中与 TabGroupActivity 一起使用时未在子 Activity 中调用

c# - ASP.NET核心: AllowSynchronousIO = true per endpoint vs per server

java - Swing:当 JTree 更新时间过长并卡住其他 GUI 元素时该怎么办?

multithreading - 如何在线程之间可变地共享 i32?

c# - 时间触发的 Azure Functions