首页 / C# / C#-字典键中的空值(永远不会插入)
C#-字典键中的空值(永远不会插入)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-字典键中的空值(永远不会插入),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2384字,纯文字阅读大概需要4分钟。
内容图文
![C#-字典键中的空值(永远不会插入)](/upload/InfoBanner/zyjiaocheng/650/7c8b971097324cac9b58af9954144d31.jpg)
在下面的代码中,我插入了一些虚拟代码来检查null并删除它们,以尝试了解问题的根源.我仍然不明白为什么我的问题会发生:)
我有以下将值插入字典的方法:
private Dictionary<string, DateTimeOffset> _keys = new Dictionary<string, DateTimeOffset>();
public async Task NotifyAsync(DateTimeOffset key)
{
if (key==null)
{
this._logger.LogError("Recieved null key");
return;
}
var dictKey = RadarContext.TrimTimeToPartitionBin(key, TimeSpan.FromMinutes(1));
if (string.IsNullOrEmpty(dictKey))
{
this._logger.LogError("Recieved null dictKey for {time}",key);
return;
}
_keys[dictKey] = key;
await this.SetLastUpdatedAsync(DateTimeOffset.UtcNow);
}
没有其他插入.
然后我有以下内容,稍后循环遍历键
foreach(var key in _keys.Keys.Where(k => string.IsNullOrEmpty( k )).ToArray())
{
_logger.LogError("Removed null key: {time}",_keys[key]);
_keys.Remove(key);
}
foreach (var key in _keys.Keys.OrderByDescending(key=> RadarContext.FromTrim(key,_logger)).Take(100).ToArray())
{
if (_keys[key] < tminus1)
{
await actionblock.SendAsync(key);
}
}
我的问题是我在RadarContext.FromTrim中得到一个空异常
public static DateTimeOffset FromTrim(string trim, ILogger logger = null)
{
try
{
var ticks = long.Parse(trim);
return new DateTimeOffset(DateTimeOffset.MaxValue.UtcTicks - ticks, TimeSpan.Zero);
}
catch(Exception ex)
{
if (logger != null)
logger.LogError(ex, "Failed to convert from {trim}", trim);
throw;
}
}
错误如下:
2019-03-05 23:15:21.922 +01:00 [ERR] Failed to convert from null
System.ArgumentNullException: Value cannot be null.
Parameter name: s
at System.Int64.Parse(String s)
at Ascend.Wammo.RadarIngestor.ServiceProvider.RadarContext.FromTrim(String trim, ILogger logger) in C:\dev\AscendXYZ\Ascend.Wammo.RadarIngestor\apps\Ascend.Wammo.RadarIngestor.ServiceProvider\RadarContext.cs:line 493
当从不插入null时,在循环_keys.Keys.OrderByDescending(key => RadarContext.FromTrim(key,_logger))时,这里的给定代码如何可能为FromTrim提供null.
解决方法:
问题在于您正在使用Dictionary< TKey,TValue>来自多个线程,这不是本来的目的.大概在一个线程中对内部状态的某些修改导致在另一个线程中看到空键.
ConcurrentDictionary< TKey,TValue>用于多个线程-但我仍然会避免以目前使用的方式使用它.现在,您要遍历键并分别对每个键进行查找.我会遍历条目:
var entries = _keys
.OrderByDescending(entry => RadarContext.FromTrim(entry.Key, _logger))
.Take(100)
.ToArray();
foreach (var entry in entries)
{
if (entry.Value < tminus1)
{
await actionblock.SendAsync(entry.Key);
}
}
这样,您将获得一致的快照.
内容总结
以上是互联网集市为您收集整理的C#-字典键中的空值(永远不会插入)全部内容,希望文章能够帮你解决C#-字典键中的空值(永远不会插入)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。