我正在制作一个程序,我需要在几毫秒内获得时间.到时候,我的意思是一个永远不会与自己相等的数字,并且总是比一秒钟前更大的1000个数字.我已经尝试过转换DateTime.Now
为a TimeSpan
并TotalMilliseconds
从中得到...但我听说它并不完全准确.
有更简单的方法吗?
我正在使用时间戳来临时命令我的程序中的并发更改,并要求更改的每个时间戳都是唯一的.但是,我发现简单地调用DateTime.Now
是不够的,因为如果快速连续调用,它通常会返回相同的值.
我有一些想法,但没有任何事情让我觉得这是"最好的"解决方案.有没有一种方法可以保证每次连续调用都能产生一个独特的DateTime
?
我应该为此使用不同的类型,也许是长整数?DateTime
具有明显的优势,可以像实时一样轻松解释,不像增量计数器.
更新:这是我最终编写的一个简单的折衷解决方案,它仍然允许我DateTime
用作我的临时密钥,同时在每次调用方法时确保唯一性:
private static long _lastTime; // records the 64-bit tick value of the last time
private static object _timeLock = new object();
internal static DateTime GetCurrentTime() {
lock ( _timeLock ) { // prevent concurrent access to ensure uniqueness
DateTime result = DateTime.UtcNow;
if ( result.Ticks <= _lastTime )
result = new DateTime( _lastTime + 1 );
_lastTime = result.Ticks;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
因为每个滴答值只有一千万分之一秒,所以这种方法在每秒调用1000万次时会引入明显的时钟偏差(顺便说一句,它的执行效率足够高),这意味着它是完全可以接受我的目的.
这是一些测试代码:
DateTime start …
Run Code Online (Sandbox Code Playgroud) 重复:如何在.NET/C#中获取刻度精度的时间戳?
我如何从Stopwatch.GetTimestamp()到DateTime
假设Stopwatch.IsHighResolution是真的
假设我播放一个317,520,000个样本的立体声WAV文件,理论上是1小时.假设没有播放的中断,将在文件播放结束正好一小时还是有在播放速度偶尔有一些微小的变化使得它将超过一小时稍多或稍少(通过数毫秒)?
我正在尝试将动画与音频同步,我正在使用a System.Diagnostics.Stopwatch
来保持帧与音频匹配.但是,如果Windows中WAV音频的播放速度随时间略有不同,则音频将与秒表驱动的动画不同步.
这导致了第二个问题:似乎a Stopwatch
- 虽然高度精细且准确,持续时间短 - 运行速度稍快.在我的笔记本电脑上,Stopwatch
运行24小时(通过计算机的系统时间和真正的秒表测量)显示24小时的经过时间加上大约5秒(不是毫秒).
这是一个已知的问题Stopwatch
吗?(一个相关的问题是"我疯了吗?",但你可以自己尝试一下.)鉴于它作为诊断工具的用途,我可以看到这样的差异只会在测量长持续时间时出现,其中大多数人们会使用除了a之外的东西Stopwatch
.
如果我真的很幸运,那么两者Stopwatch
和音频播放都是由相同的底层机制驱动的,因此会在几天内保持同步.这是真的吗?
更新:我刚刚做了数学计算,如果Stopwatch
在24小时内漂移5秒,这意味着它会在172秒后漂移10毫秒.因此,在3分钟内,动画将开始明显不同步.
我正在周期性地(大约每10秒左右)尝试从waveOutWrite回调中重新启动计时器,但这不起作用,因为随后回调的不准确性将导致整个下一组计时器事件被抵消. .很难成为我.
给定一个时间戳字符串来自另一台机器A到机器B(例如hh:mm:ss.fff
),并假设两台机器的时钟同步,我怎样才能让机器B计算其时钟与来自机器A的字符串中的时间之间的时间跨度?
我试过比较DateTime.Now.Ticks
,但分辨率似乎是10-20毫秒.我想计算更接近1毫秒的分辨率.
一段时间以来,我已经成功地Stopwatch.GetTimestamp()
用于高分辨率计时,但请记住它不是那么简单,因为我只有机器B中可用的字符串,并且没有很好的方法来校准Stopwatch.GetTimestamp
实际的系统时间.
我当前使用此方法(C#)来获取以毫秒为单位的 Unix 时间:
long UnixTime()
{
return (long) (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalMilliseconds;
}
Run Code Online (Sandbox Code Playgroud)
问题- 有没有办法获得以纳秒为单位的unix时间?
提前致谢。
使用VB.net,创建一个名为staff的新类,它有三个属性:Name,LastName,ID - 应该适合用作数据库中的主键.
提供一个类构造函数来填充Name和LastName.ID应该在构造函数中自动生成,不应该传入.
我知道如何创建类,属性和构造函数,我只需要知道如何在构造函数中自动生成ID字段.是否有可能做到这一点?
我通常做的是将数据库中的id字段作为标识字段和主键,以便自动插入下一个可用的id或在我的应用程序中,我从数据库中读取最后一个ID并向其中添加一个ID.但我需要知道如何在构造函数中自动生成ID字段.
在我的c#代码中,我有一个静态方法.这是代码示例:
public class RandomKey
{
public static string GetKey()
{
Random rng = new Random();
char[] chars = new char[8];
for (int i = 0; i < chars.Length; i++)
{
int v = rng.Next(10 + 26 + 26);
char c;
if (v < 10)
{
c = (char)('0' + v);
}
else if (v < 36)
{
c = (char)('a' - 10 + v);
}
else
{
c = (char)('A' - 36 + v);
}
chars[i] = c;
}
string …
Run Code Online (Sandbox Code Playgroud) 我的代码需要一个非常精确的时间戳。我使用这篇文章的第一个解决方案:
DateTime _starttime = DateTime.UtcNow;
Stopwatch _stopwatch = Stopwatch.StartNew();
Run Code Online (Sandbox Code Playgroud)
然后稍后调用它
DateTime highresDT = _starttime.AddTicks(_stopwatch.Elapsed.Ticks);
Run Code Online (Sandbox Code Playgroud)
但是当我想用 MessageBox.Show(highresDT.ToString());
我只有 :
30/06/2016 14:59:06
Run Code Online (Sandbox Code Playgroud)
我想显示毫秒。是否可以?!谢谢你。
我是 c# 新手,我可能完全误解了我的问题。
c# ×6
.net ×5
datetime ×4
audio ×1
concurrency ×1
constructor ×1
milliseconds ×1
stopwatch ×1
vb.net ×1
windows ×1