一、数据接收测试。
数量级和时间的关系,还有就是稳定性。
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.运行测试,可以了。