Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在for循环之后无法访问va relisport的值_C#_Loops_For Loop - Fatal编程技术网

C# 在for循环之后无法访问va relisport的值

C# 在for循环之后无法访问va relisport的值,c#,loops,for-loop,C#,Loops,For Loop,我现在正在做一个项目,使用UI从windows服务打开中继。例如,如果选择继电器1,则继电器1应工作;如果选择继电器2,则继电器1应工作。由于代码对我来说是新的,我试图通过附加一个进程来调试它。在调试期间,我可以看到totalrelais计数为2 var totalrelais = currentRelaisCard.Relais.Count(); private void setRelaisStatus() { 长相对运动=0; 如果(_relais==null | | u relais.

我现在正在做一个项目,使用UI从windows服务打开中继。例如,如果选择继电器1,则继电器1应工作;如果选择继电器2,则继电器1应工作。由于代码对我来说是新的,我试图通过附加一个进程来调试它。在调试期间,我可以看到totalrelais计数为2

 var totalrelais = currentRelaisCard.Relais.Count();
private void setRelaisStatus()
{
长相对运动=0;
如果(_relais==null | | u relais.Count==0)
返回;
尝试
{
var managedRelaisCardIDs=_relais.Where(r=>r.RelaisCard!=null)。选择(r=>r.RelaisCard.RelaisCardID)。Distinct().ToList();
foreach(在ManagedRelaidCardDS中输入var managedRelaidCardId)
{
List finishedRelais=新列表();
#区域获取当前控制器每个继电器的状态
string debugText=string.Empty;
var currentRelaisCard=\u relaisCards.FirstOrDefault(r=>r.RelaisCardID==managedRelaidCardId);
var relaisOfCurrentCard=\u relais.Where(r=>r.RelaisCard.RelaisCardID==managedRelaidCardId);
var totalrelais=currentRelaisCard.Relais.Count();
for(int i=1;i r.Relais.RelaisNumber==i);
//此继电器不可用或处于活动状态
if(matchingRelais==null)
{
debugText++=“Relais”+i.ToString()+”:0“+Environment.NewLine;
继续;
}
//此relais的活动期已结束
如果(!matchingRelais.Relais.IsBusy)
{
finishedRelais.Add(_relais.First(r=>r.relais.RelaisID==matchingRelais.relais.RelaisID).relais.RelaisID);
//_relais.Remove(_relais.First(r=>r.relais.RelaisID==matchingRelais.relais.RelaisID));
debugText++=“Relais”+i.ToString()+”:0“+Environment.NewLine;
继续;
}
if(matchingRelais.Relais.MainPeriodStart-DateTime.Now)
{
relaisPorts+=(long)Math.Pow(2,(i-1));
debugText++=“Relais”+i.ToString()+”:1(“+(int)(matchingRelais.Relais.mainpiordend-DateTime.Now).TotalSeconds+“seconds left)”+Environment.NewLine;
}
}
如果(relisport==1)
{
如果(!string.IsNullOrEmpty(debugText))
debugText+=Environment.NewLine;
#端区
var relaicommand=buildrelaicommand(relaicommandtype.SetRelais,relaicommandtype.EnableRelayOne);
//如果relais状态未更改,且最后一个发送命令的时间不超过8秒(relais安全性)…则不需要重新发送
如果(currentRelaisCard.LastSendCommand==null||
BitConverter.ToString(CurrentRelaiCard.LastSendCommand)!=BitConverter.ToString(RelaiCommand)||
(DateTime.Now-CurrentRelaiCard.LastSendCommandTime).TotalSeconds>=8)
{
sendRelaisCommand(relaisCommand,currentRelaisCard);
如果(!string.IsNullOrEmpty(debugText))
debugText+=Environment.NewLine+DateTime.Now.ToLongTimeString()+“向控制器发送命令:”+(BitConverter.ToString(RelaiCommand)+Environment.NewLine);
}
我创建了一个变量relisport并存储了I的值,因为第一个变量I是1。relisport也应该等于1。因此我创建了一个if循环,它表示if(relisport==1)然后中继一个应该工作。但在运行时测试控制台无法访问该值。是我的逻辑错误,还是我缺少一些东西,因为我是编程界的新手,请帮助我

谢谢,
Kushagra Rathi

任何要在两个for循环外部访问的变量都必须在循环之前移动声明。
 private void setRelaisStatus()
        {
            long relaisPorts = 0;

            if (_relais == null || _relais.Count == 0)
                return;

            try
            {
                var managedRelaisCardIDs = _relais.Where(r => r.RelaisCard != null).Select(r => r.RelaisCard.RelaisCardID).Distinct().ToList();

                foreach (var managedRelaidCardId in managedRelaisCardIDs)
                {
                    List<Guid> finishedRelais = new List<Guid>();
                    #region Get status for each relais of the current controller
                    string debugText = string.Empty;
                    var currentRelaisCard = _relaisCards.FirstOrDefault(r => r.RelaisCardID == managedRelaidCardId);
                    var relaisOfCurrentCard = _relais.Where(r => r.RelaisCard.RelaisCardID == managedRelaidCardId);
                    var totalrelais = currentRelaisCard.Relais.Count();
                    for (int i = 1; i <= totalrelais; i++)
                    {

                        if (string.IsNullOrEmpty(debugText))
                        {
                            debugText += Environment.NewLine + DateTime.Now.ToLongTimeString() + " Setting up relais-status for controller on " + currentRelaisCard.SerialPortName + Environment.NewLine;
                        }

                        var matchingRelais = relaisOfCurrentCard.FirstOrDefault(r => r.Relais.RelaisNumber == i);

                        // This relais is not available or active
                        if (matchingRelais == null)
                        {
                            debugText += "Relais " + i.ToString() + ": 0" + Environment.NewLine;
                            continue;
                        }


                        // This relais's active period is over
                        if (!matchingRelais.Relais.IsBusy)
                        {
                            finishedRelais.Add(_relais.First(r => r.Relais.RelaisID == matchingRelais.Relais.RelaisID).Relais.RelaisID);
                            //_relais.Remove(_relais.First(r => r.Relais.RelaisID == matchingRelais.Relais.RelaisID));
                            debugText += "Relais " + i.ToString() + ": 0" + Environment.NewLine;
                            continue;
                        }
                        if (matchingRelais.Relais.MainPeriodStart <= DateTime.Now &&
                            matchingRelais.Relais.MainPeriodEnd > DateTime.Now)
                        {
                            relaisPorts += (long)Math.Pow(2, (i - 1));
                            debugText += "Relais " + i.ToString() + ": 1 (" + (int)(matchingRelais.Relais.MainPeriodEnd - DateTime.Now).TotalSeconds + " seconds left)" + Environment.NewLine;
                        }
                    }

                    if (relaisPorts == 1)
                    {
                        if (!string.IsNullOrEmpty(debugText))
                            debugText += Environment.NewLine;
                        #endregion


                        var relaisCommand = buildRelaisCommand(RelaisCommandType.SetRelais, RelaisCommandType.EnableRelayOne);

                    

                        // If relais status didn't change and the last send command is not older than 8 seconds (relais security)... a new sending is not required
                        if (currentRelaisCard.LastSendCommand == null ||
                           BitConverter.ToString(currentRelaisCard.LastSendCommand) != BitConverter.ToString(relaisCommand) ||
                           (DateTime.Now - currentRelaisCard.LastSendCommandTime).TotalSeconds >= 8)
                        {
                            
                            sendRelaisCommand(relaisCommand, currentRelaisCard);
                            if (!string.IsNullOrEmpty(debugText))
                                debugText += Environment.NewLine + DateTime.Now.ToLongTimeString() + " Sending command to controller: " + (BitConverter.ToString(relaisCommand) + Environment.NewLine);
                        }