使用UDP输入的.NET并行处理
我正在思考如何在我的应用程序中并行化我的数据处理。让我解释一下模型和数据流的结构: 型号:使用UDP输入的.NET并行处理,.net,algorithm,parallel-processing,task-parallel-library,udpclient,.net,Algorithm,Parallel Processing,Task Parallel Library,Udpclient,我正在思考如何在我的应用程序中并行化我的数据处理。让我解释一下模型和数据流的结构: 型号: public CollectData(proc proc) { _proc = proc; PoolClass.lstDataType1 = new List<DataType1>(); } public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2) { fore
public CollectData(proc proc)
{
_proc = proc;
PoolClass.lstDataType1 = new List<DataType1>();
}
public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2)
{
foreach (DataType1 dt1Data in lstDT1)
{
DataType1 dt1 = new DataType1(dt1ID, lstDT2, IncRec);
PoolClass.lstDataType1.Add(dt1);
}
}
delegate void ProcCallback(int dtID);
private void ProcRec(int dtID)
{
if (_proc != null)
{
_proc(dtID);
}
}
public void Push(Message message)
{
PoolClass.lstDataType1.Where(t => t.dtId == message.DT1ID).FirstOrDefault().lstDataType2.Where(d => d.Id == message.DT2ID).FirstOrDefault().Stack.Push(message);
}
public class DataType1
{
public int dtId;
public List<DataType2> lstDataType2;
public DataType1(int tdt1ID, List<DataType2> lstDT2, incRec incRec)
{
foreach (DataType2 dt2 in list)
{
DataType2 dt2 = new DataType2(DataLimitReached);
lstDataType2.Add(dt2);
}
}
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
_proc(dt1ID);
}
}
public class DataType2
{
public DataType3 Stack;
Stack = new DataType3(DataLimitReached);
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
public class DataType3
{
public delegate void DataLimitReached();
public DataLimitReached _DataLimitReached;
public DataType3[] arrData;
public DataStack(DataLimitReached DataLimitReached)
{
_DataLimitReached = DataLimitReached;
}
public void Push(Message message)
{
//add message to arrData
//check if data limit was reached, build average
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
Server udpServer = new Server(port);
this.udpServer.OnMessage += new Server.DelegateMessageReceived(udpServer_OnMessage);
Module module = new Module();
module.Init();
module.OnProcData += new Module.RecHandler(module_OnProcData);
void udpServer_OnMessage(Message message)
{
procMessage(message);
}
private void procMessage(Message message)
{
module.setData(message);
//I tried: this.actionBlock.Post(message);
}
void module_OnProcData(Module m, ModuleEventArgs e)
{
//log data result or put to listbox
}
public class PoolClass
{
public static List<DataType1> lstDataType1;
}
public CollectData cData;
public void Init()
{
cData = new CollectData(Proc);
List<DataType2> lstDT2 = new List<DataType2>;
cData.Init(lstDT2);
}
public void setData(Message message)
{
cData.Push(message);
}
delegate void ProcCallback(int dtID);
private void Proc(int dtID)
{
DoCalculation(dtID);
//I tried: this.actionBlock.Post(dtID);
}
private void RaiseProcEvent(ModuleEventArgs e)
{
if (OnProcData != null)
{
OnProcData(this, e);
}
}
public void DoCalculation(int DT1Id)
{
//do calculation
RaiseProcEvent(e);
}
public class Server
public delegate void DelegateMessageReceived(Message message);
Task.Run(async () =>
{
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localpt);
while (true)
{
if (udpClient.Available > 0)
{
var receiveBytes = await udpClient.ReceiveAsync();
if (receiveBytes.Buffer.Length <= 0)
return;
Message message = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(receiveBytes.Buffer));
if (OnMessage != null)
{
OnMessage(message);
}
//I tried: this.actionBlock.Post(message);
}
}
}
});
}
- DataType1类型的列表
- 每个DataType1都包含DataType2的列表
- 每个DataType2包含一个DataType3类
- 每个数据类型3都包含一个int的列表
public CollectData(proc proc)
{
_proc = proc;
PoolClass.lstDataType1 = new List<DataType1>();
}
public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2)
{
foreach (DataType1 dt1Data in lstDT1)
{
DataType1 dt1 = new DataType1(dt1ID, lstDT2, IncRec);
PoolClass.lstDataType1.Add(dt1);
}
}
delegate void ProcCallback(int dtID);
private void ProcRec(int dtID)
{
if (_proc != null)
{
_proc(dtID);
}
}
public void Push(Message message)
{
PoolClass.lstDataType1.Where(t => t.dtId == message.DT1ID).FirstOrDefault().lstDataType2.Where(d => d.Id == message.DT2ID).FirstOrDefault().Stack.Push(message);
}
public class DataType1
{
public int dtId;
public List<DataType2> lstDataType2;
public DataType1(int tdt1ID, List<DataType2> lstDT2, incRec incRec)
{
foreach (DataType2 dt2 in list)
{
DataType2 dt2 = new DataType2(DataLimitReached);
lstDataType2.Add(dt2);
}
}
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
_proc(dt1ID);
}
}
public class DataType2
{
public DataType3 Stack;
Stack = new DataType3(DataLimitReached);
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
public class DataType3
{
public delegate void DataLimitReached();
public DataLimitReached _DataLimitReached;
public DataType3[] arrData;
public DataStack(DataLimitReached DataLimitReached)
{
_DataLimitReached = DataLimitReached;
}
public void Push(Message message)
{
//add message to arrData
//check if data limit was reached, build average
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
Server udpServer = new Server(port);
this.udpServer.OnMessage += new Server.DelegateMessageReceived(udpServer_OnMessage);
Module module = new Module();
module.Init();
module.OnProcData += new Module.RecHandler(module_OnProcData);
void udpServer_OnMessage(Message message)
{
procMessage(message);
}
private void procMessage(Message message)
{
module.setData(message);
//I tried: this.actionBlock.Post(message);
}
void module_OnProcData(Module m, ModuleEventArgs e)
{
//log data result or put to listbox
}
public class PoolClass
{
public static List<DataType1> lstDataType1;
}
public CollectData cData;
public void Init()
{
cData = new CollectData(Proc);
List<DataType2> lstDT2 = new List<DataType2>;
cData.Init(lstDT2);
}
public void setData(Message message)
{
cData.Push(message);
}
delegate void ProcCallback(int dtID);
private void Proc(int dtID)
{
DoCalculation(dtID);
//I tried: this.actionBlock.Post(dtID);
}
private void RaiseProcEvent(ModuleEventArgs e)
{
if (OnProcData != null)
{
OnProcData(this, e);
}
}
public void DoCalculation(int DT1Id)
{
//do calculation
RaiseProcEvent(e);
}
public class Server
public delegate void DelegateMessageReceived(Message message);
Task.Run(async () =>
{
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localpt);
while (true)
{
if (udpClient.Available > 0)
{
var receiveBytes = await udpClient.ReceiveAsync();
if (receiveBytes.Buffer.Length <= 0)
return;
Message message = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(receiveBytes.Buffer));
if (OnMessage != null)
{
OnMessage(message);
}
//I tried: this.actionBlock.Post(message);
}
}
}
});
}
- 输入:UDP数据(使用异步udpclient实现)
- 从UDP类向主类引发事件(带有消息) 信息:每条消息包含DataType1和DataType2等信息
- 每条消息都被推送到DataType3的int值列表中
- 如果int值列表达到指定的值量:
- 引发事件以调用生成结果的算法
public CollectData(proc proc)
{
_proc = proc;
PoolClass.lstDataType1 = new List<DataType1>();
}
public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2)
{
foreach (DataType1 dt1Data in lstDT1)
{
DataType1 dt1 = new DataType1(dt1ID, lstDT2, IncRec);
PoolClass.lstDataType1.Add(dt1);
}
}
delegate void ProcCallback(int dtID);
private void ProcRec(int dtID)
{
if (_proc != null)
{
_proc(dtID);
}
}
public void Push(Message message)
{
PoolClass.lstDataType1.Where(t => t.dtId == message.DT1ID).FirstOrDefault().lstDataType2.Where(d => d.Id == message.DT2ID).FirstOrDefault().Stack.Push(message);
}
public class DataType1
{
public int dtId;
public List<DataType2> lstDataType2;
public DataType1(int tdt1ID, List<DataType2> lstDT2, incRec incRec)
{
foreach (DataType2 dt2 in list)
{
DataType2 dt2 = new DataType2(DataLimitReached);
lstDataType2.Add(dt2);
}
}
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
_proc(dt1ID);
}
}
public class DataType2
{
public DataType3 Stack;
Stack = new DataType3(DataLimitReached);
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
public class DataType3
{
public delegate void DataLimitReached();
public DataLimitReached _DataLimitReached;
public DataType3[] arrData;
public DataStack(DataLimitReached DataLimitReached)
{
_DataLimitReached = DataLimitReached;
}
public void Push(Message message)
{
//add message to arrData
//check if data limit was reached, build average
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
Server udpServer = new Server(port);
this.udpServer.OnMessage += new Server.DelegateMessageReceived(udpServer_OnMessage);
Module module = new Module();
module.Init();
module.OnProcData += new Module.RecHandler(module_OnProcData);
void udpServer_OnMessage(Message message)
{
procMessage(message);
}
private void procMessage(Message message)
{
module.setData(message);
//I tried: this.actionBlock.Post(message);
}
void module_OnProcData(Module m, ModuleEventArgs e)
{
//log data result or put to listbox
}
public class PoolClass
{
public static List<DataType1> lstDataType1;
}
public CollectData cData;
public void Init()
{
cData = new CollectData(Proc);
List<DataType2> lstDT2 = new List<DataType2>;
cData.Init(lstDT2);
}
public void setData(Message message)
{
cData.Push(message);
}
delegate void ProcCallback(int dtID);
private void Proc(int dtID)
{
DoCalculation(dtID);
//I tried: this.actionBlock.Post(dtID);
}
private void RaiseProcEvent(ModuleEventArgs e)
{
if (OnProcData != null)
{
OnProcData(this, e);
}
}
public void DoCalculation(int DT1Id)
{
//do calculation
RaiseProcEvent(e);
}
public class Server
public delegate void DelegateMessageReceived(Message message);
Task.Run(async () =>
{
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localpt);
while (true)
{
if (udpClient.Available > 0)
{
var receiveBytes = await udpClient.ReceiveAsync();
if (receiveBytes.Buffer.Length <= 0)
return;
Message message = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(receiveBytes.Buffer));
if (OnMessage != null)
{
OnMessage(message);
}
//I tried: this.actionBlock.Post(message);
}
}
}
});
}
@斯维克:谢谢你的回复。我试着对我的结构进行更详细的阐述。
下面是一些源代码。如您所见,我使用了很多回调构造、不同的类、列表等等。首先回答问题2和3:
我目前使用的是双核处理器,我可能没有机会得到它
使用性能更好的任何东西。我希望在表现上有所提高的原因
是因为希望我的源代码可以针对它进行优化。
当我使用任务并行库时,我构建了一个特殊类型的actionblock
调用Post而不是我以前的代码,后者调用了执行相同代码的方法
和以前一样(只是希望在引擎盖下它与任务等并行完成)。
(您可以在下面我的源代码(“我尝试过”)中找到这些行)
一旦达到数据限制,就会引发一系列回调。每个数据类型1都已完成,
一旦他的一个DataType2元素有一个填充堆栈。然后,一个算法开始运行
比较不同的堆栈。
这是为每个DataType1元素完成的,因此我希望以某种方式并行完成
在这里您可以找到一些代码片段。
p、 美国:我试图通过第二个应用程序模拟数据,因为我构建了一个包含近4000条消息的列表,这些消息通过foreach循环中的udp发送到我的应用程序。(在同一台机器上使用相同的端口)
模型类(每个类向其上级类转发回调):
收集数据:
public CollectData(proc proc)
{
_proc = proc;
PoolClass.lstDataType1 = new List<DataType1>();
}
public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2)
{
foreach (DataType1 dt1Data in lstDT1)
{
DataType1 dt1 = new DataType1(dt1ID, lstDT2, IncRec);
PoolClass.lstDataType1.Add(dt1);
}
}
delegate void ProcCallback(int dtID);
private void ProcRec(int dtID)
{
if (_proc != null)
{
_proc(dtID);
}
}
public void Push(Message message)
{
PoolClass.lstDataType1.Where(t => t.dtId == message.DT1ID).FirstOrDefault().lstDataType2.Where(d => d.Id == message.DT2ID).FirstOrDefault().Stack.Push(message);
}
public class DataType1
{
public int dtId;
public List<DataType2> lstDataType2;
public DataType1(int tdt1ID, List<DataType2> lstDT2, incRec incRec)
{
foreach (DataType2 dt2 in list)
{
DataType2 dt2 = new DataType2(DataLimitReached);
lstDataType2.Add(dt2);
}
}
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
_proc(dt1ID);
}
}
public class DataType2
{
public DataType3 Stack;
Stack = new DataType3(DataLimitReached);
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
public class DataType3
{
public delegate void DataLimitReached();
public DataLimitReached _DataLimitReached;
public DataType3[] arrData;
public DataStack(DataLimitReached DataLimitReached)
{
_DataLimitReached = DataLimitReached;
}
public void Push(Message message)
{
//add message to arrData
//check if data limit was reached, build average
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
Server udpServer = new Server(port);
this.udpServer.OnMessage += new Server.DelegateMessageReceived(udpServer_OnMessage);
Module module = new Module();
module.Init();
module.OnProcData += new Module.RecHandler(module_OnProcData);
void udpServer_OnMessage(Message message)
{
procMessage(message);
}
private void procMessage(Message message)
{
module.setData(message);
//I tried: this.actionBlock.Post(message);
}
void module_OnProcData(Module m, ModuleEventArgs e)
{
//log data result or put to listbox
}
public class PoolClass
{
public static List<DataType1> lstDataType1;
}
public CollectData cData;
public void Init()
{
cData = new CollectData(Proc);
List<DataType2> lstDT2 = new List<DataType2>;
cData.Init(lstDT2);
}
public void setData(Message message)
{
cData.Push(message);
}
delegate void ProcCallback(int dtID);
private void Proc(int dtID)
{
DoCalculation(dtID);
//I tried: this.actionBlock.Post(dtID);
}
private void RaiseProcEvent(ModuleEventArgs e)
{
if (OnProcData != null)
{
OnProcData(this, e);
}
}
public void DoCalculation(int DT1Id)
{
//do calculation
RaiseProcEvent(e);
}
public class Server
public delegate void DelegateMessageReceived(Message message);
Task.Run(async () =>
{
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localpt);
while (true)
{
if (udpClient.Available > 0)
{
var receiveBytes = await udpClient.ReceiveAsync();
if (receiveBytes.Buffer.Length <= 0)
return;
Message message = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(receiveBytes.Buffer));
if (OnMessage != null)
{
OnMessage(message);
}
//I tried: this.actionBlock.Post(message);
}
}
}
});
}
数据类型3:
public CollectData(proc proc)
{
_proc = proc;
PoolClass.lstDataType1 = new List<DataType1>();
}
public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2)
{
foreach (DataType1 dt1Data in lstDT1)
{
DataType1 dt1 = new DataType1(dt1ID, lstDT2, IncRec);
PoolClass.lstDataType1.Add(dt1);
}
}
delegate void ProcCallback(int dtID);
private void ProcRec(int dtID)
{
if (_proc != null)
{
_proc(dtID);
}
}
public void Push(Message message)
{
PoolClass.lstDataType1.Where(t => t.dtId == message.DT1ID).FirstOrDefault().lstDataType2.Where(d => d.Id == message.DT2ID).FirstOrDefault().Stack.Push(message);
}
public class DataType1
{
public int dtId;
public List<DataType2> lstDataType2;
public DataType1(int tdt1ID, List<DataType2> lstDT2, incRec incRec)
{
foreach (DataType2 dt2 in list)
{
DataType2 dt2 = new DataType2(DataLimitReached);
lstDataType2.Add(dt2);
}
}
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
_proc(dt1ID);
}
}
public class DataType2
{
public DataType3 Stack;
Stack = new DataType3(DataLimitReached);
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
public class DataType3
{
public delegate void DataLimitReached();
public DataLimitReached _DataLimitReached;
public DataType3[] arrData;
public DataStack(DataLimitReached DataLimitReached)
{
_DataLimitReached = DataLimitReached;
}
public void Push(Message message)
{
//add message to arrData
//check if data limit was reached, build average
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
Server udpServer = new Server(port);
this.udpServer.OnMessage += new Server.DelegateMessageReceived(udpServer_OnMessage);
Module module = new Module();
module.Init();
module.OnProcData += new Module.RecHandler(module_OnProcData);
void udpServer_OnMessage(Message message)
{
procMessage(message);
}
private void procMessage(Message message)
{
module.setData(message);
//I tried: this.actionBlock.Post(message);
}
void module_OnProcData(Module m, ModuleEventArgs e)
{
//log data result or put to listbox
}
public class PoolClass
{
public static List<DataType1> lstDataType1;
}
public CollectData cData;
public void Init()
{
cData = new CollectData(Proc);
List<DataType2> lstDT2 = new List<DataType2>;
cData.Init(lstDT2);
}
public void setData(Message message)
{
cData.Push(message);
}
delegate void ProcCallback(int dtID);
private void Proc(int dtID)
{
DoCalculation(dtID);
//I tried: this.actionBlock.Post(dtID);
}
private void RaiseProcEvent(ModuleEventArgs e)
{
if (OnProcData != null)
{
OnProcData(this, e);
}
}
public void DoCalculation(int DT1Id)
{
//do calculation
RaiseProcEvent(e);
}
public class Server
public delegate void DelegateMessageReceived(Message message);
Task.Run(async () =>
{
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localpt);
while (true)
{
if (udpClient.Available > 0)
{
var receiveBytes = await udpClient.ReceiveAsync();
if (receiveBytes.Buffer.Length <= 0)
return;
Message message = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(receiveBytes.Buffer));
if (OnMessage != null)
{
OnMessage(message);
}
//I tried: this.actionBlock.Post(message);
}
}
}
});
}
Main:
public CollectData(proc proc)
{
_proc = proc;
PoolClass.lstDataType1 = new List<DataType1>();
}
public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2)
{
foreach (DataType1 dt1Data in lstDT1)
{
DataType1 dt1 = new DataType1(dt1ID, lstDT2, IncRec);
PoolClass.lstDataType1.Add(dt1);
}
}
delegate void ProcCallback(int dtID);
private void ProcRec(int dtID)
{
if (_proc != null)
{
_proc(dtID);
}
}
public void Push(Message message)
{
PoolClass.lstDataType1.Where(t => t.dtId == message.DT1ID).FirstOrDefault().lstDataType2.Where(d => d.Id == message.DT2ID).FirstOrDefault().Stack.Push(message);
}
public class DataType1
{
public int dtId;
public List<DataType2> lstDataType2;
public DataType1(int tdt1ID, List<DataType2> lstDT2, incRec incRec)
{
foreach (DataType2 dt2 in list)
{
DataType2 dt2 = new DataType2(DataLimitReached);
lstDataType2.Add(dt2);
}
}
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
_proc(dt1ID);
}
}
public class DataType2
{
public DataType3 Stack;
Stack = new DataType3(DataLimitReached);
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
public class DataType3
{
public delegate void DataLimitReached();
public DataLimitReached _DataLimitReached;
public DataType3[] arrData;
public DataStack(DataLimitReached DataLimitReached)
{
_DataLimitReached = DataLimitReached;
}
public void Push(Message message)
{
//add message to arrData
//check if data limit was reached, build average
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
Server udpServer = new Server(port);
this.udpServer.OnMessage += new Server.DelegateMessageReceived(udpServer_OnMessage);
Module module = new Module();
module.Init();
module.OnProcData += new Module.RecHandler(module_OnProcData);
void udpServer_OnMessage(Message message)
{
procMessage(message);
}
private void procMessage(Message message)
{
module.setData(message);
//I tried: this.actionBlock.Post(message);
}
void module_OnProcData(Module m, ModuleEventArgs e)
{
//log data result or put to listbox
}
public class PoolClass
{
public static List<DataType1> lstDataType1;
}
public CollectData cData;
public void Init()
{
cData = new CollectData(Proc);
List<DataType2> lstDT2 = new List<DataType2>;
cData.Init(lstDT2);
}
public void setData(Message message)
{
cData.Push(message);
}
delegate void ProcCallback(int dtID);
private void Proc(int dtID)
{
DoCalculation(dtID);
//I tried: this.actionBlock.Post(dtID);
}
private void RaiseProcEvent(ModuleEventArgs e)
{
if (OnProcData != null)
{
OnProcData(this, e);
}
}
public void DoCalculation(int DT1Id)
{
//do calculation
RaiseProcEvent(e);
}
public class Server
public delegate void DelegateMessageReceived(Message message);
Task.Run(async () =>
{
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localpt);
while (true)
{
if (udpClient.Available > 0)
{
var receiveBytes = await udpClient.ReceiveAsync();
if (receiveBytes.Buffer.Length <= 0)
return;
Message message = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(receiveBytes.Buffer));
if (OnMessage != null)
{
OnMessage(message);
}
//I tried: this.actionBlock.Post(message);
}
}
}
});
}
Server udpServer=新服务器(端口);
this.udpServer.OnMessage+=新服务器.DelegateMessageReceived(udpServer_OnMessage);
模块=新模块();
module.Init();
module.OnProcData+=新的module.RecHandler(module_OnProcData);
无效udpServer_OnMessage(消息消息消息)
{
procMessage(消息);
}
私有消息(消息消息消息)
{
模块设置数据(消息);
//我试过:this.actionBlock.Post(message);
}
无效模块(模块m,模块e)
{
//记录数据结果或放入列表框
}
公共类池类
{
公共静态列表lstDataType1;
}
模块:
public CollectData(proc proc)
{
_proc = proc;
PoolClass.lstDataType1 = new List<DataType1>();
}
public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2)
{
foreach (DataType1 dt1Data in lstDT1)
{
DataType1 dt1 = new DataType1(dt1ID, lstDT2, IncRec);
PoolClass.lstDataType1.Add(dt1);
}
}
delegate void ProcCallback(int dtID);
private void ProcRec(int dtID)
{
if (_proc != null)
{
_proc(dtID);
}
}
public void Push(Message message)
{
PoolClass.lstDataType1.Where(t => t.dtId == message.DT1ID).FirstOrDefault().lstDataType2.Where(d => d.Id == message.DT2ID).FirstOrDefault().Stack.Push(message);
}
public class DataType1
{
public int dtId;
public List<DataType2> lstDataType2;
public DataType1(int tdt1ID, List<DataType2> lstDT2, incRec incRec)
{
foreach (DataType2 dt2 in list)
{
DataType2 dt2 = new DataType2(DataLimitReached);
lstDataType2.Add(dt2);
}
}
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
_proc(dt1ID);
}
}
public class DataType2
{
public DataType3 Stack;
Stack = new DataType3(DataLimitReached);
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
public class DataType3
{
public delegate void DataLimitReached();
public DataLimitReached _DataLimitReached;
public DataType3[] arrData;
public DataStack(DataLimitReached DataLimitReached)
{
_DataLimitReached = DataLimitReached;
}
public void Push(Message message)
{
//add message to arrData
//check if data limit was reached, build average
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
Server udpServer = new Server(port);
this.udpServer.OnMessage += new Server.DelegateMessageReceived(udpServer_OnMessage);
Module module = new Module();
module.Init();
module.OnProcData += new Module.RecHandler(module_OnProcData);
void udpServer_OnMessage(Message message)
{
procMessage(message);
}
private void procMessage(Message message)
{
module.setData(message);
//I tried: this.actionBlock.Post(message);
}
void module_OnProcData(Module m, ModuleEventArgs e)
{
//log data result or put to listbox
}
public class PoolClass
{
public static List<DataType1> lstDataType1;
}
public CollectData cData;
public void Init()
{
cData = new CollectData(Proc);
List<DataType2> lstDT2 = new List<DataType2>;
cData.Init(lstDT2);
}
public void setData(Message message)
{
cData.Push(message);
}
delegate void ProcCallback(int dtID);
private void Proc(int dtID)
{
DoCalculation(dtID);
//I tried: this.actionBlock.Post(dtID);
}
private void RaiseProcEvent(ModuleEventArgs e)
{
if (OnProcData != null)
{
OnProcData(this, e);
}
}
public void DoCalculation(int DT1Id)
{
//do calculation
RaiseProcEvent(e);
}
public class Server
public delegate void DelegateMessageReceived(Message message);
Task.Run(async () =>
{
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localpt);
while (true)
{
if (udpClient.Available > 0)
{
var receiveBytes = await udpClient.ReceiveAsync();
if (receiveBytes.Buffer.Length <= 0)
return;
Message message = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(receiveBytes.Buffer));
if (OnMessage != null)
{
OnMessage(message);
}
//I tried: this.actionBlock.Post(message);
}
}
}
});
}
公共数据采集cData;
公共void Init()
{
cData=新采集数据(Proc);
列表lstDT2=新列表;
cData.Init(lstDT2);
}
公共无效设置数据(消息)
{
cData.推送(信息);
}
委托无效回调(int-dtID);
私有无效过程(int dtID)
{
数据计算(dtID);
//我试过:this.actionBlock.Post(dtID);
}
私有无效提升程序(模块EventArgs e)
{
如果(OnProcData!=null)
{
OnProcData(本,e);
}
}
公共无效数据计算(int DT1Id)
{
//计算
提高程序(e);
}
UDP:
public CollectData(proc proc)
{
_proc = proc;
PoolClass.lstDataType1 = new List<DataType1>();
}
public void Init(List<DataType1> lstDT1, List<DataType2> lstDT2)
{
foreach (DataType1 dt1Data in lstDT1)
{
DataType1 dt1 = new DataType1(dt1ID, lstDT2, IncRec);
PoolClass.lstDataType1.Add(dt1);
}
}
delegate void ProcCallback(int dtID);
private void ProcRec(int dtID)
{
if (_proc != null)
{
_proc(dtID);
}
}
public void Push(Message message)
{
PoolClass.lstDataType1.Where(t => t.dtId == message.DT1ID).FirstOrDefault().lstDataType2.Where(d => d.Id == message.DT2ID).FirstOrDefault().Stack.Push(message);
}
public class DataType1
{
public int dtId;
public List<DataType2> lstDataType2;
public DataType1(int tdt1ID, List<DataType2> lstDT2, incRec incRec)
{
foreach (DataType2 dt2 in list)
{
DataType2 dt2 = new DataType2(DataLimitReached);
lstDataType2.Add(dt2);
}
}
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
_proc(dt1ID);
}
}
public class DataType2
{
public DataType3 Stack;
Stack = new DataType3(DataLimitReached);
delegate void DataLimitReachedCallback();
private void DataLimitReached()
{
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
public class DataType3
{
public delegate void DataLimitReached();
public DataLimitReached _DataLimitReached;
public DataType3[] arrData;
public DataStack(DataLimitReached DataLimitReached)
{
_DataLimitReached = DataLimitReached;
}
public void Push(Message message)
{
//add message to arrData
//check if data limit was reached, build average
if (_DataLimitReached != null)
{
_DataLimitReached();
}
}
}
Server udpServer = new Server(port);
this.udpServer.OnMessage += new Server.DelegateMessageReceived(udpServer_OnMessage);
Module module = new Module();
module.Init();
module.OnProcData += new Module.RecHandler(module_OnProcData);
void udpServer_OnMessage(Message message)
{
procMessage(message);
}
private void procMessage(Message message)
{
module.setData(message);
//I tried: this.actionBlock.Post(message);
}
void module_OnProcData(Module m, ModuleEventArgs e)
{
//log data result or put to listbox
}
public class PoolClass
{
public static List<DataType1> lstDataType1;
}
public CollectData cData;
public void Init()
{
cData = new CollectData(Proc);
List<DataType2> lstDT2 = new List<DataType2>;
cData.Init(lstDT2);
}
public void setData(Message message)
{
cData.Push(message);
}
delegate void ProcCallback(int dtID);
private void Proc(int dtID)
{
DoCalculation(dtID);
//I tried: this.actionBlock.Post(dtID);
}
private void RaiseProcEvent(ModuleEventArgs e)
{
if (OnProcData != null)
{
OnProcData(this, e);
}
}
public void DoCalculation(int DT1Id)
{
//do calculation
RaiseProcEvent(e);
}
public class Server
public delegate void DelegateMessageReceived(Message message);
Task.Run(async () =>
{
using (var udpClient = new UdpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(localpt);
while (true)
{
if (udpClient.Available > 0)
{
var receiveBytes = await udpClient.ReceiveAsync();
if (receiveBytes.Buffer.Length <= 0)
return;
Message message = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(receiveBytes.Buffer));
if (OnMessage != null)
{
OnMessage(message);
}
//I tried: this.actionBlock.Post(message);
}
}
}
});
}
公共类服务器
接收到公共委托无效的DelegateMessage(消息消息);
Task.Run(异步()=>
{
使用(var udpClient=new udpClient())
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
udpClient.Client.Bind(localpt);
while(true)
{
如果(udpClient.Available>0)
{
var receiveBytes=await udpClient.ReceiveAsync();
如果(receiveBytes.Buffer.Length 1.从你的描述中,我不清楚到底发生了什么。你能提供一些代码来演示数据流是如何工作的吗?2.是什么让你认为你可以实现10倍的加速?你有一台拥有10个以上内核的机器吗?3.你能描述一下你到底尝试了什么吗?我试着回答你的问题e下面的答案,我无法将那么多信息添加到评论中,我希望这是正确的方式。(想知道否决票的情况)对您的问题的更新应该通过编辑问题而不是添加答案来完成。哦,我明白了,很抱歉,我不知道,下次会记住,谢谢。