Hololens开发(12) WCF接收信息(2)

一、数据接收测试。

数量级和时间的关系,还有就是稳定性。

0.代码

public class TestReceive : MonoBehaviour {

    public int Count = 1;

    private void OnSelect()
    {
        TestResult.Intance.Clear();
        TestResult.Intance.Write("TestReceive.OnSelect");
        gameObject.transform.Translate(Vector3.up);
        TestResult.Intance.AppendAsync("Start:" + DateTime.Now.ToString("mm:ss.fff"));
        for (int i = 1; i <= 9; i++)
        {
            DateTime start = DateTime.Now;
            WCFClientFactory.Instance.ReceiveString(Count*i, msg =>
            {
                try
                {
                    DateTime end = DateTime.Now;
                    TimeSpan span = end - start;
                    int length = msg.Length;
                    string txt = string.Format("Length:{0};Start:{1},End:{2},T:{3}", length, start.ToString("mm:ss.fff"),end.ToString("mm:ss.fff"), (int)(span.TotalMilliseconds));
                    TestResult.Intance.AppendAsync(txt);
                    WCFClientFactory.Instance.SendString(txt);
                }
                catch (Exception ex)
                {
                    WCFClientFactory.Instance.SendString(ex.ToString());
                }
            });
        }
    }


1.数量级


100-9000,基本上是50-200ms左右。

最早的一个是连接时卡住了,用了16s。


1万(100000-90000)200ms以内

10万(1000000-900000):基本1s以内,超过1s了。

1000000以上就卡住了。


甚至7000000的结果都没返回来

3.稳定性

有时候一段时间不操作后,一开始会卡一下1-10s吧,能连接上,至少不会断掉。

后面的操作都很快的。

4.结论,基本使用没问题。注意一次接收的数据不要太多久好。

二、传递对象

1.修改服务端,ICommonService添加

        [OperationContract]
        DataInfo GetData(string id,string name);

        [OperationContract]
        string SendData(DataInfo data);
    [DataContract]
    public class DataInfo
    {
        [DataMember]
        public string Id { get; set; }
        [DataMember]
        public string Name { get; set; }
    }
2.更新客户端的服务引用

3.修改Unity,IWCFClient

    [DataContract]
    public class UDataInfo
    {
        [DataMember]
        public string Id { get; set; }

        [DataMember]
        public string Name { get; set; }
    }

    public interface IWCFClient
    {
        void SendString(string msg);

        void TestReceive(int count);

        void Test();

        void ReceiveString(int count,Action<string> callback);

        void GetData(string id, string name, Action<UDataInfo> callback);

        void SendData(UDataInfo data, Action<string> callback);
    }
这里将返回值改为用回调函数,另外创建了一个UDataInfo和WCF中的DataInfo对应。

修改WCFClientFactory

public void GetData(string id, string name, Action<UDataInfo> callback)
        {
            if (Client != null)
            {
                Client.GetData(id,name, arg =>
                {
                    TaskManager.Instance.AddTask(callback, arg);
                });
            }
            else
            {
                Debug.Log("WCFClientFactory.GetData");
                if (callback != null)
                {
                    callback(null);
                }
            }
        }

        public void SendData(UDataInfo data, Action<string> callback)
        {
            if (Client != null)
            {
                Client.SendData(data, arg =>
                {
                    TaskManager.Instance.AddTask(callback, arg);
                });
            }
            else
            {
                Debug.Log("WCFClientFactory.SendData");
                if (callback != null)
                {
                    callback(null);
                }
            }
        }

4.修改UWP中的WCFClient

        public async void GetData(string id, string name, Action<UDataInfo> callback)
        {
            CommonServiceClient client = ServiceClientFactory.GetCommonServiceClient(Ip);
            DataInfo data = await client.GetDataAsync(id, name);
            UDataInfo dataU=new UDataInfo();
            dataU.Id = data.Id;
            dataU.Name = data.Name;
            await client.CloseAsync();
            if (callback != null)
            {
                callback(dataU);
            }
        }

        public async void SendData(UDataInfo data, Action<string> callback)
        {
            CommonServiceClient client = ServiceClientFactory.GetCommonServiceClient(Ip);
            DataInfo dataNew=new DataInfo();
            dataNew.Id = data.Id;
            dataNew.Name = data.Name;
            string result = await client.SendDataAsync(dataNew);
            await client.CloseAsync();
            if (callback != null)
            {
                callback(result);
            }
        }
这里在DataInfo和UDataInfo直接转换了一下。

因为DataInfo是UWP中通过更新服务引用引入的,Unity中并没有DataInfo。

5.脚本中的测试代码

{
            UDataInfo data = new UDataInfo();
            data.Id = "id1";
            data.Name = "name1";
            WCFClientFactory.Instance.SendData(data, arg =>
            {
                try
                {
                    TestResult.Intance.Append("SendData Arg:" + arg);
                }
                catch (Exception ex)
                {
                    WCFClientFactory.Instance.SendString(ex.ToString());
                }
            });
        }

        {
            WCFClientFactory.Instance.GetData("id2", "name2", data =>
            {
                try
                {
                    TestResult.Intance.Append("SendData Data:" + data.Id + "|" + data.Name);
                }
                catch (Exception ex)
                {
                    WCFClientFactory.Instance.SendString(ex.ToString());
                }
            });
        }
6.部署测试

没问题

三.共用数据类

1.创建3.5的c#类库WCFModels,将DataInfo放到WCFModels中,注意要给类库添加System.Runtime.Serialization的引用。


2.服务端宿主和服务端类库添加WCFModels项目,重新启动,服务端修改好了。

3.修改WCFModels的生成路径到Unity项目中的Assets/Plugins/文件夹


删除UDataInfo,直接用DataInfo,修改相关代码。

4.Build,在UWP项目中也会有WCFModels.dll


5.修改UWP项目的引用,添加对Unprocessed中的WCFModels.dll的引用,默认Build的项目是没有添加的。


6.删除原来更新服务引用添加的DataInfo类,修改使用DataInfo的相关的代码的命名空间到WCFModels。

7.部署,测试,没问题。

四、扩展公用类库

1.修改WCFModels里面的类,添加Text

    [DataContract]
    public class DataInfo
    {
        [DataMember]
        public string Id { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Text { get; set; }
    }
稍微修改服务端函数

        public DataInfo GetData(string id, string name)
        {
            DataInfo data=new DataInfo();
            data.Id = id;
            data.Name = name;
            data.Text = string.Format("Id:{0},Name:{1}", id, name);
            return data;
        }

2.修改生成目录,并生成。

因为Assembly-CSharp项目引用的WCFModels也是Unprocessed里面的,修改WCFModels项目的生成目录为Unprocessed。

3.修改Unity脚本相关代码,显示Text的内容

4.部署,生成。

5.出问题了,Hololens中直接无法启动程序了。

 启动后处于休眠状态,点击一下,等待旋转一下,还是休眠状态。

6.还是修改WCFModels项目的生成目录为Plugin,生成dll

7.Build项目

8.部署项目

9.运行测试,可以了。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值