C# 列表<;任务<;结果>&燃气轮机;所有任务都有相同的结果
我是C#的新手,我必须为我的教育考试写一个小项目 我必须每隔500毫秒(500毫秒)通过telnet读取一些传感器。C# 列表<;任务<;结果>&燃气轮机;所有任务都有相同的结果,c#,list,task,C#,List,Task,我是C#的新手,我必须为我的教育考试写一个小项目 我必须每隔500毫秒(500毫秒)通过telnet读取一些传感器。 因此,我通过使用任务类来实现这一点。 我在每个周期生成一个任务列表,等待它们准备就绪(超时后,我使用令牌取消它们),然后读取结果。 但是所有的结果都是一样的,也许它们都是第一个或最后一个任务,这是有反应的 以下是我的片段: do { finished = false; activcnt = 0
因此,我通过使用
任务类来实现这一点。
我在每个周期生成一个任务列表,等待它们准备就绪(超时后,我使用令牌取消它们),然后读取结果。
但是所有的结果都是一样的,也许它们都是第一个或最后一个任务,这是有反应的
以下是我的片段:
do
{
finished = false;
activcnt = 0;
tskcnt = 0;
cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
/// generate Tasks
messcnt++;
val.mscount = messcnt;
sw.Start();
for (int i = 0; i < arrlengt; i++)
{
if (clients[i] != null && clients[i].Connected &&
(parent._swork.lstSensor[i].sensState==1) )
{
task2arr[tskcnt] = parent._swork.lstSensor[i].sensIdx;
tasks.Add(Messung(clients[i], parent._swork.lstSensor[i], val, ct));
}
}
/// wait until tasks are running
try {
if (!Task.WaitAll(tasks.ToArray(), 400))
{
cts.Cancel();
}
else
{
finished = true;
}
} catch (Exc.. e){..}
time = (sw.ElapsedMilliseconds);
/// result to list
var results = new List<Values>(6);
foreach (var item in tasks)
{
results.Add(item.Result);
}
}
_output.LogOutput(results);
CheckErrorCnt(arrlengt, errcnt);
tasks.Clear();
time = (intervall - sw.ElapsedMilliseconds);
Thread.Sleep((int)time);
sw.Stop();
sw.Reset();
}
while (parent._gblset.measurestart == true);
private Task<Values> Messung(TcpClient client , Sensor sens , Values val, CancellationToken ct )
{
string msg;
return Task.Run(() =>
{
int mscnt = val.mscount;
var _con = new Connecting();
if (ct.IsCancellationRequested)
{
msg= sens.name+" : No response within specified time";
val.errstring = msg;
return val;
}
string response = _con.GetMeasure(client, ct);
val = parent._calc.GetValues(response, sens.kennIdx);
val.sensname = sens.name;
val.channame = sens.description;
val.sensidx = sens.sensIdx;
val.mscount = mscnt;
if (ct.IsCancellationRequested)
{
msg = "Error: " + sens.name + " : No response within specified time";
val.errstring = msg;
return val;
}
return val;
});
}
}
do
{
完成=错误;
activcnt=0;
tskcnt=0;
cts=新的CancellationTokenSource();
取消令牌ct=cts.Token;
///生成任务
messcnt++;
val.mscount=messcnt;
sw.Start();
对于(int i=0;i
{
int mscnt=val.mscount;
var_con=新连接();
如果(ct.IsCancellationRequested)
{
msg=sens.name+“:指定时间内无响应”;
val.errstring=msg;
返回val;
}
字符串响应=_con.GetMeasure(客户端,ct);
val=父项。\u计算获取值(响应,sens.kennIdx);
val.sensname=sens.name;
val.channame=sens.description;
val.sensidx=sens.sensidx;
val.mscount=mscnt;
如果(ct.IsCancellationRequested)
{
msg=“错误:“+sens.name+”:在指定时间内没有响应”;
val.errstring=msg;
返回val;
}
返回val;
});
}
}
您能验证您的代码片段吗?看起来您可能缺少某些部分(例如,尝试后没有捕获)。我甚至不认为这会被编译。在这篇文章中,我将代码片段缩减到核心。没有错误处理,也没有异常处理。这在我的项目中效果很好。