如何使我的计数器增加到 1 以上?事件处理程序 C#
How can I enable my counters to increase beyond 1? EventHandler C#
所以我使用 Impinj OctaneSDK 运行 R420 reader 并收集存在的标签清单并在一些文本框中显示每种标签的数量。
用于发现标签的事件处理程序非常简单,来自 reader 的标签报告是可配置的。我正在做我所有的操作来计算事件处理程序中每种类型的标签,我担心这会导致我最多只能达到 1。(同样值得注意的是我处理了这个案例通过将标签从其列表中删除,在一段时间内看不到该标签。)
任何人都知道如何使列表在事件处理程序调用的实例之间相对容易地保持不变?
void OnTagsReported(ImpinjReader sender, TagReport report )
{
// This event handler is called asynchronously
// when tag reports are available.
// Loop through each tag in the report
// and print the data.
List <Tag> listMed1 = new List<Tag>();
List<Tag> listMed2 = new List<Tag>();
List<Tag> listMed3 = new List<Tag>();
List<Tag> listMed4 = new List<Tag>();
List<Tag> listMed5 = new List<Tag>();
List<Tag> tags = new List<Tag>();
foreach (Tag tag in report)
{
ushort AntennaNum = tag.AntennaPortNumber;
tags.Add(tag);
int size = tags.Count();
int i = 0;
while (i < size)
{
Impinj.OctaneSdk.TagData first = tags[i].Epc;
string epcCheck = first.ToString();
if (epcCheck.IndexOf("A") != -1)
{
listMed1.Add(tags[i]);
}
if (epcCheck.IndexOf("B") != -1)
{
listMed2.Add(tags[i]);
}
if (epcCheck.IndexOf("C") != -1)
{
listMed3.Add(tags[i]);
}
if (epcCheck.IndexOf("D") != -1)
{
listMed4.Add(tags[i]);
}
if (epcCheck.IndexOf("E") != -1)
{
listMed5.Add(tags[i]);
}
i++;
}
int Med1num = listMed1.Count();
int Med2num = listMed2.Count();
int Med3num = listMed3.Count();
int Med4num = listMed4.Count();
int Med5num = listMed5.Count();
int loopr1 = 0;
int loopr2 = 0;
int loopr3 = 0;
int loopr4 = 0;
int loopr5 = 0;
while (loopr1< Med1num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed1[loopr1].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000 )
{
listMed1.RemoveAt(loopr1);
}
loopr1++;
}
while (loopr2 < Med2num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed2[loopr2].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000)
{
listMed2.RemoveAt(loopr2);
}
loopr2++;
}
while (loopr3 < Med3num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed3[loopr3].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000)
{
listMed3.RemoveAt(loopr3);
}
loopr3++;
}
while (loopr4 < Med4num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed4[loopr4].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000)
{
listMed4.RemoveAt(loopr4);
}
loopr4++;
}
while (loopr5 < Med5num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed5[loopr5].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000)
{
listMed5.RemoveAt(loopr5);
}
loopr5++;
}
Med1num = listMed1.Count();
Med2num = listMed2.Count();
Med3num = listMed3.Count();
Med4num = listMed4.Count();
Med5num = listMed5.Count();
SetText(Med1num, Med2num, Med3num, Med4num, Med5num);
}
}
将您的标记变量移出函数,因为每次调用事件时它都会重新实例化并初始化为 count = 0。
List<Tag> tags = new List<Tag>();
void OnTagsReported(ImpinjReader sender, TagReport report )
{
...
}
这不是对您问题的直接回答,而是 "mega" 评论。
您可以使代码更小。
这是重构后的版本:
void OnTagsReported(ImpinjReader sender, TagReport report)
{
List<Tag> tags = report.ToList();
var lists =
new [] { "A", "B", "C", "D", "E", }
.Select(c =>
tags
.Where(tag => tag.Epc.ToString().IndexOf(c) != -1)
.ToList())
.ToList();
foreach (var list in lists)
{
list.RemoveAll(tag =>
{
Impinj.OctaneSdk.ImpinjTimestamp second = tag.LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
return secondsSinceEpoch - lastseen > 5000;
});
}
SetText(lists.Select(list => list.Count()).ToArray());
}
假定 SetText
具有签名 void SetText(params int[] xs)
。如果不是,你只需要将参数放入一个变量中,然后一个一个地发送每个值。
从这里我不明白为什么需要将 tags
作为字段级变量推出。在我看来,你需要每次都计算它。
你能解释一下如何将 tags
推到方法之外吗?
所以我使用 Impinj OctaneSDK 运行 R420 reader 并收集存在的标签清单并在一些文本框中显示每种标签的数量。
用于发现标签的事件处理程序非常简单,来自 reader 的标签报告是可配置的。我正在做我所有的操作来计算事件处理程序中每种类型的标签,我担心这会导致我最多只能达到 1。(同样值得注意的是我处理了这个案例通过将标签从其列表中删除,在一段时间内看不到该标签。)
任何人都知道如何使列表在事件处理程序调用的实例之间相对容易地保持不变?
void OnTagsReported(ImpinjReader sender, TagReport report )
{
// This event handler is called asynchronously
// when tag reports are available.
// Loop through each tag in the report
// and print the data.
List <Tag> listMed1 = new List<Tag>();
List<Tag> listMed2 = new List<Tag>();
List<Tag> listMed3 = new List<Tag>();
List<Tag> listMed4 = new List<Tag>();
List<Tag> listMed5 = new List<Tag>();
List<Tag> tags = new List<Tag>();
foreach (Tag tag in report)
{
ushort AntennaNum = tag.AntennaPortNumber;
tags.Add(tag);
int size = tags.Count();
int i = 0;
while (i < size)
{
Impinj.OctaneSdk.TagData first = tags[i].Epc;
string epcCheck = first.ToString();
if (epcCheck.IndexOf("A") != -1)
{
listMed1.Add(tags[i]);
}
if (epcCheck.IndexOf("B") != -1)
{
listMed2.Add(tags[i]);
}
if (epcCheck.IndexOf("C") != -1)
{
listMed3.Add(tags[i]);
}
if (epcCheck.IndexOf("D") != -1)
{
listMed4.Add(tags[i]);
}
if (epcCheck.IndexOf("E") != -1)
{
listMed5.Add(tags[i]);
}
i++;
}
int Med1num = listMed1.Count();
int Med2num = listMed2.Count();
int Med3num = listMed3.Count();
int Med4num = listMed4.Count();
int Med5num = listMed5.Count();
int loopr1 = 0;
int loopr2 = 0;
int loopr3 = 0;
int loopr4 = 0;
int loopr5 = 0;
while (loopr1< Med1num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed1[loopr1].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000 )
{
listMed1.RemoveAt(loopr1);
}
loopr1++;
}
while (loopr2 < Med2num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed2[loopr2].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000)
{
listMed2.RemoveAt(loopr2);
}
loopr2++;
}
while (loopr3 < Med3num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed3[loopr3].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000)
{
listMed3.RemoveAt(loopr3);
}
loopr3++;
}
while (loopr4 < Med4num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed4[loopr4].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000)
{
listMed4.RemoveAt(loopr4);
}
loopr4++;
}
while (loopr5 < Med5num)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed5[loopr5].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 5000)
{
listMed5.RemoveAt(loopr5);
}
loopr5++;
}
Med1num = listMed1.Count();
Med2num = listMed2.Count();
Med3num = listMed3.Count();
Med4num = listMed4.Count();
Med5num = listMed5.Count();
SetText(Med1num, Med2num, Med3num, Med4num, Med5num);
}
}
将您的标记变量移出函数,因为每次调用事件时它都会重新实例化并初始化为 count = 0。
List<Tag> tags = new List<Tag>();
void OnTagsReported(ImpinjReader sender, TagReport report )
{
...
}
这不是对您问题的直接回答,而是 "mega" 评论。
您可以使代码更小。
这是重构后的版本:
void OnTagsReported(ImpinjReader sender, TagReport report)
{
List<Tag> tags = report.ToList();
var lists =
new [] { "A", "B", "C", "D", "E", }
.Select(c =>
tags
.Where(tag => tag.Epc.ToString().IndexOf(c) != -1)
.ToList())
.ToList();
foreach (var list in lists)
{
list.RemoveAll(tag =>
{
Impinj.OctaneSdk.ImpinjTimestamp second = tag.LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
return secondsSinceEpoch - lastseen > 5000;
});
}
SetText(lists.Select(list => list.Count()).ToArray());
}
假定 SetText
具有签名 void SetText(params int[] xs)
。如果不是,你只需要将参数放入一个变量中,然后一个一个地发送每个值。
从这里我不明白为什么需要将 tags
作为字段级变量推出。在我看来,你需要每次都计算它。
你能解释一下如何将 tags
推到方法之外吗?