0

我需要做的是从一个调用的方法中获取 foreach 值private void ReceiveData()并将它们发送到另一个方法void Update()。如何在 C# 中做到这一点?

private void ReceiveData() 
    {

       IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("10.0.2.217"), port);
       client = new UdpClient(remoteIP);
        while (true) 
        {
           try 
            {
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                data = client.Receive(ref anyIP);

                int nIndex = 0;
                foreach(SignalIndex si in xmlreader.cdpSignals)
                {
                     x= ReadSingleBigEndian(data, si.index + 0);
                     y= ReadSingleBigEndian(data, si.index + 4);
                     z= ReadSingleBigEndian(data, si.index + 8);
                     alpha= ReadSingleBigEndian(data, si.index + 12);
                     theta= ReadSingleBigEndian(data, si.index + 16);
                     phi= ReadSingleBigEndian(data, si.index + 20);

                //  xmlreader.unityGameObjects[nIndex].transform.localPosition = new Vector3(x,y,z);
                //  xmlreader.unityGameObjects[nIndex].transform.Rotate(alpha,theta,phi);   
                }

            }
            catch (Exception err) 
            {
               print(err.ToString());
            }

        }

        client.Close();
    }


    void Update() 
    {
        foreach(GameObject go in xmlreader.unityGameObjects)
        {
            go.transform.localPosition = new Vector3(x,y,z);
            go.transform.transform.Rotate(alpha,theta,phi);
        }
    }

有 2 种方法,我需要从 ReceiveData() 获取 foreach 中的值并在方法 Update() 中实例化它们。ReceiveData() 中的 foreach 中的所有变量都是公共的,但在 Update() 中它们都取 0。

4

2 回答 2

0

foreach 的工作方式如下:

在您的方法 ( ReceiveData) 中,您将循环使用某种方法。然后从那个循环你可以调用另一个方法(Update)。但是,您将不得不传递这些变量。您的方法目前是无效的,并且没有任何参数。

我建议如下:

private void ReceiveData()
{
    var data = GetMyDataFromSomewhere(); // data should be an IEnumerable of some sort

    foreach (MyDataItemType dataItem in data)
    {
        Update(dataItem);
    }
}

private void UpdateData(MyDataItemType dataItem)
{
    // Do some update to dataItem here...
}

在您使用更多代码进行新更新后,还有更多信息可供使用。显然,您正在类(、、、等)中设置一些字段x/y属性z。update 方法将使用这些来更新一些东西。

那么为什么不从循环中调用Update(),或者在foreach循环之后调用,如果它只需要在设置后完成:

foreach(SignalIndex si in xmlreader.cdpSignals)
{
    x= ReadSingleBigEndian(data, si.index + 0);
    y= ReadSingleBigEndian(data, si.index + 4);
    z= ReadSingleBigEndian(data, si.index + 8);
    alpha= ReadSingleBigEndian(data, si.index + 12);
    theta= ReadSingleBigEndian(data, si.index + 16);
    phi= ReadSingleBigEndian(data, si.index + 20);

    UpdateData(); // Just call it!
}
于 2012-11-22T13:41:05.430 回答
0

编辑2:

ReaderWriterLockSlim 的文档:http: //msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

struct CoordData
{
    public float X, Y, Z, Alpha, Theta, Phi;
    public int NIndex;
}

private List<CoordData> coordDataList = new List<CoordData>();
private ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();

private void ReceiveData() 
{

   IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("10.0.2.217"), port);
   client = new UdpClient(remoteIP);
    while (true) 
    {
       try 
        {
            IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
            data = client.Receive(ref anyIP);

            int nIndex = 0;
            foreach(SignalIndex si in xmlreader.cdpSignals)
            {
                 x= ReadSingleBigEndian(data, si.index + 0);
                 y= ReadSingleBigEndian(data, si.index + 4);
                 z= ReadSingleBigEndian(data, si.index + 8);
                 alpha= ReadSingleBigEndian(data, si.index + 12);
                 theta= ReadSingleBigEndian(data, si.index + 16);
                 phi= ReadSingleBigEndian(data, si.index + 20);

                 lockObj.EnterWriteLock();
                 try
                 {
                     coordDataList.Add(new CoordData() { X = x, Y = y, Z = z, Alpha = alpha, Theta = theta, Phi = phi, NIndex = nIndex });
                 }
                 finally
                 {
                     lockObj.ExitWriteLock();
                 }

                 nIndex++; //I'm assuming you want to do this here otherwise you'll be changing the same object in the array every time  
            }

        }
        catch (Exception err) 
        {
           print(err.ToString());
        }

    }

    client.Close();
}

void Update()
{
    lockObj.EnterReadLock();
    try
    {
        foreach (CoordData data in coordDataList)
        {
            xmlReader.unityGameObjects[data.NIndex].localPosition = new Vector3(data.X,data.Y,data.Z);
            xmlReader.unityGameObjects[data.NIndex].Rotate(data.Alpha,data.Theta,data.Phi);
        }
    }
    finally
    {
        lockObj.ExitReadLock();
    }
}
于 2012-11-22T13:44:23.970 回答