相关疑难解决方法(0)

是否有基于任务的System.Threading.Timer替换?

我是.Net 4.0的任务的新手,我无法找到我认为基于任务的替换或实现定时器,例如定期任务.有这样的事吗?

更新 我提出了我认为是我的需求的解决方案,即将"计时器"功能包装在具有子任务的任务中,所有任务都利用CancellationToken并返回任务以便能够参与进一步的任务步骤.

public static Task StartPeriodicTask(Action action, int intervalInMilliseconds, int delayInMilliseconds, CancellationToken cancelToken)
{ 
    Action wrapperAction = () =>
    {
        if (cancelToken.IsCancellationRequested) { return; }

        action();
    };

    Action mainAction = () =>
    {
        TaskCreationOptions attachedToParent = TaskCreationOptions.AttachedToParent;

        if (cancelToken.IsCancellationRequested) { return; }

        if (delayInMilliseconds > 0)
            Thread.Sleep(delayInMilliseconds);

        while (true)
        {
            if (cancelToken.IsCancellationRequested) { break; }

            Task.Factory.StartNew(wrapperAction, cancelToken, attachedToParent, TaskScheduler.Current);

            if (cancelToken.IsCancellationRequested || intervalInMilliseconds == Timeout.Infinite) { break; }

            Thread.Sleep(intervalInMilliseconds);
        }
    };

    return Task.Factory.StartNew(mainAction, cancelToken);
}      
Run Code Online (Sandbox Code Playgroud)

c# timeout timer .net-4.0 task-parallel-library

84
推荐指数
5
解决办法
6万
查看次数

如何在.NET/C#中获取tick精度的时间戳?

到目前为止,我用来DateTime.Now获取时间戳,但是我注意到如果你DateTime.Now在一个循环中打印,你会看到它以大约的离散跳跃增量.15毫秒 但对于我的应用程序中的某些情况,我需要获得最准确的时间戳,最好是精确到tick(= 100 ns).有任何想法吗?

更新:

显然,StopWatch/ QueryPerformanceCounter是要走的路,但它只能用于测量时间,因此我考虑DateTime.Now在应用程序启动时调用,然后StopWatch运行,然后只将经过的时间从StopWatch返回的初始值中添加DateTime.Now.至少那应该给我准确的相对时间戳,对吧?你怎么看待(黑客)?

注意:

StopWatch.ElapsedTicks不同于StopWatch.Elapsed.Ticks!我使用前者假设1 tick = 100 ns,但在这种情况下1 tick = 1/StopWatch.Frequency.所以要获得相当于DateTime使用的刻度StopWatch.Elapsed.Ticks.我刚刚学到了这个困难的方法.

笔记2:

使用StopWatch方法,我注意到它与实时不同步.大约10个小时后,它提前5秒.所以我想我们必须每隔X左右重新同步一次,其中X可能是1小时30分钟,15分钟等等.我不确定重新同步的最佳时间跨度是什么,因为每次重新同步都会改变偏移量,这可能是最多20毫秒.

.net c# timestamp

61
推荐指数
5
解决办法
5万
查看次数

使用DateTime.Now.Ticks生成唯一数字ID

我需要生成一个唯一的数字ID来附加到传入的请求.此ID仅用于临时跟踪请求,并在请求完成处理后将被丢弃.此ID仅在此应用程序的上下文中使用,但需要以高性能多线程方式分配.

我正在考虑使用DateTime.Now.Ticks来获取此ID,但是想知道如果同时处理同时请求,DateTime.Now.Ticks是否仍会生成冲突ID?

如果有人可以在多线程环境中建议一种更好的方法来生成这些ID(最好不是像Int这样的Int64),请告诉我.如果只是在递增之前我不必锁定数字,那么像递增数字一样简单就足够了.

非常感谢您的帮助.

.net c# algorithm concurrency multithreading

14
推荐指数
2
解决办法
2万
查看次数

Mongodb中的时间序列存储

我有大约1000个传感器在白天输出数据.每个传感器每天输出大约100,000个点.当我查询数据时,我只对在给定日期从给定传感器获取数据感兴趣.我不做任何跨传感器查询.时间间隔不均匀,我需要保持时间分辨率,所以我不能做像每秒1点的数组.

我打算多年来存储数据.我想知道哪种方案是最好的:

  1. 每天/传感器对对应一个集合,因此每天向我的数据库添加1000个大约100,000个文档的集合
  2. 每个传感器对应一个集合.我有1000个固定数量的集合,每天增加约100,000个文档.

1直觉上查询似乎更快.我使用的是mongoDb 3.4,它对数据库中的集合数没有限制.

2看起来更干净但我担心收藏会变得庞大,随着每个收藏的增长,查询会逐渐变慢

我赞成1,但我可能错了.有什么建议?

更新:

我遵循了建议

https://bluxte.net/musings/2015/01/21/efficient-storage-non-periodic-time-series-mongodb/

我没有为每次测量存储一个文档,而是一个包含128个测量,startDate,nextDate的文档.它减少了文档的数量,从而减少了索引大小,但我仍然不确定如何组织集合.

当我查询数据时,我只想要(日期,传感器)对的数据,这就是我认为1可能加速读取的原因.我目前在我的数据库中有大约20,000个集合,当我查询所有集合的列表时,需要很长时间才能让我认为拥有这么多集合并不是一个好主意.

你怎么看?

time-series mongodb

7
推荐指数
1
解决办法
1151
查看次数

是否可以减少DateTime.Now.Ticks.ToString("X")的长度并仍然保持唯一性?

我有一些与我工作的硬件的限制,其中我只能广播(无线)26个字符.

为了克服这种限制,第一广播发送转换为十六进制(DateTime.Now.Ticks.ToString( "X" ))的时间戳,以及正在发送的消息的长度(也作为十六进制字符串).

接收软件测试标头消息,当它确认收到标题消息时,将时间戳(重新转换为a long)存储在字典中:

/*************************************************************************
 * _pendingMessages.Add( DateTime.Now.Ticks, Tuple.Create( MessageLength, string.Empty ) );
 * T.Item1 = Message Length
 * T.Item2 = Message ( when Message.Length == Length, Pop Message )
 *************************************************************************/
private static Dictionary<long, Tuple<long, string>> _pendingMessages;
Run Code Online (Sandbox Code Playgroud)

不幸的是,每次都必须传递时间戳,它超过了分配字符长度的一半(现在为15个字符).

所以我想的是,我可以通过将十六进制字符串的字符值相加来减少它,而不是传递整个时间戳:

例如 :

DateTime.Now.Ticks.ToSTring("X").Sum( C => C ).ToString("X");
Run Code Online (Sandbox Code Playgroud)

不幸的是,一个快速的测试毫不客气地吹走了这个想法

(重复键很快):

Dictionary<string, long> _dctTest = new Dictionary<string, long>( );
while ( true ){
    long dtNow = DateTime.Now.Ticks;
    string strKey = dtNow.ToString("X").Sum( C => C ).ToStrings("X");
    _dctTest.Add( strKey, dtNow …
Run Code Online (Sandbox Code Playgroud)

c# compression datetime timestamp

2
推荐指数
1
解决办法
2108
查看次数

用于生成唯一编号的C#按位操作

我试图在DateTime滴答和增加数字的帮助下在c#中生成唯一值.伪代码:

  1. 从DateTime.Now ticks(让我们命名为A)取最后43位有效位
  2. 从增加的序列中取最后21位(让它命名为'B')
  3. 左移'A'21次(让它命名为'C')
  4. 在A和C中做二进制OR

我运行测试以生成200万个数字并插入具有唯一约束集的数据库列并且它成功运行.

以下是执行此操作的代码段:

    private static long _sequence = 1;
    public static long GetUniqueNumber()
        {
            const int timeShift = 21;            
            var dateTime = DateTime.Now.Ticks;
            const long dateTimeMask = ~(0L) >> timeShift; 
            const long sequenceMask = ((~(0L) >> (64 - timeShift))); 
            var seq = Interlocked.Increment(ref _sequence);
            var dateTimeNo = (dateTimeMask & dateTime) << timeShift;
            var seqNum = (seq & sequenceMask);    
            var num = dateTimeNo | seqNum;
            return num;
        }
Run Code Online (Sandbox Code Playgroud)

我有两个问题:1.这个逻辑是否足以产生唯一数字?我发现有些生成的数字是'-ve',我不明白.

欢迎任何帮助/建议/改进.

c# algorithm bit-manipulation unique c#-4.0

0
推荐指数
1
解决办法
760
查看次数