作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试确定我使用的代码是否是线程安全的。我基本上是在尝试从不同的线程多次调用一个方法,并捕获方法中某些调用完成所需的时间。
这是我正在做的一个例子。
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/
我是一名优秀的程序员,十分优秀!