我用下面的代碼:Task.StartNew()多次調用返回只有一次
var tuple = Tuple.Create("xxx.xx.xx.xxx", 6102, "109", "Metrix1", 1);
var tuple1 = Tuple.Create("xxx.xx.xx.xxx", 6102, "110", "Metrix2", 1);
var tuple2 = Tuple.Create("xxx.xx.xx.xxx", 6102, "111", "Metrix3", 1);
var tuple3 = Tuple.Create("xxx.xx.xx.xxx", 6103, "106", "Metrix4", 2);
gateways.Add(tuple);
gateways.Add(tuple1);
gateways.Add(tuple2);
gateways.Add(tuple3);
foreach (var gatewayId in gateways)
{
Task.Factory.StartNew(
() => GetJobs(
gatewayId.Item1,
gatewayId.Item2,
gatewayId.Item3,
gatewayId.Item4,
gatewayId.Item5));
}
這然後調用GetJobs這就要求CallGateway
,如果需要ProcessMessageNew
private string GetJobs(string Url , int portNumber, string Engineer , string mEngineer , int GatewayId)
{
ConfigLogger.Instance.LogInfo("info", "Calling Gateway Start: " + DateTime.Now.ToString("HH:mm:ss.ffff") + " for engineer: " + Engineer);
string gatewayResult = CallGateway(Engineer, Url, portNumber);
ConfigLogger.Instance.LogInfo("info", "Calling Gateway End: " + DateTime.Now.ToString("HH:mm:ss.ffff") + " for engineer: " + Engineer);
if (gatewayResult != null)
{
ConfigLogger.Instance.LogInfo("info", "Processing Request Message: " + DateTime.Now.ToString("HH:mm:ss.ffff") + " for engineer: " + Engineer);
ProcessMessageNew(gatewayResult, Engineer, Url, portNumber , MEngineer ,PGatewayId);
}
return gatewayResult;
}
CallGateway
:
public string CallGateway(string gatewayUrl, int portNumber , string engineer)
{
string result = null;
int streamBufferSize = 1000;
IPHostEntry ipHostInfo = Dns.Resolve(gatewayUrl.ToString());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, portNumber);
// Create a TCP/IP socket.
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(ipAddress, portNumber);
// Set these on app param
clientSocket.ReceiveTimeout = 300000;
clientSocket.SendTimeout = 60000;
// build message string to send to gateway
string message = BuildMessageGetJobsFromGateway(engineer, SendTypeIn);
// Create a NetworkStream that owns clientSocket and
// then create a BufferedStream on top of the NetworkStream.
// Both streams are disposed when execution exits the
// using statement.
using (var netStream = new NetworkStream(clientSocket, true),
var bufStream = new BufferedStream(netStream, streamBufferSize))
{
// Check whether the underlying stream supports seeking.
Console.WriteLine("NetworkStream {0} seeking.\n", bufStream.CanSeek ? "supports" : "does not support");
//variable used to only close once
bool doClose = true;
// Send and receive data.
if (bufStream.CanWrite)
{
try
{
SendData(netStream, bufStream, SendTypeIn, message);
}
catch (Exception exSend)
{
Console.WriteLine(exSend.Message.ToString());
}
}
if (bufStream.CanRead)
{
try
{
result = ReceiveData(netStream, bufStream, clientSocket);
}
catch (Exception exRecieve)
{
//
}
finally
{
Console.WriteLine("Closing Stream");
doClose = false;
bufStream.Close();
clientSocket.Close();
}
}
// When bufStream is closed, netStream is in turn
// closed, which in turn shuts down the connection
// and closes clientSocket.
Console.WriteLine("\nShutting down the connection.");
// only close if no exception is raised
if (doClose)
{
bufStream.Close();
clientSocket.Close();
}
}
return result;
}
}
但是,我在日誌文件4來電去電網關方法和工程師106只有一個返回,調用網關創建一個Socket客戶端,然後接收數據,但只發生了一出4個電話:
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:19] - Calling Gateway Start: 16:47:19.6574 for engineer: 109
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:19] - Processing Call Mobile Gateway: 16:47:19.6624
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:20] - Calling Gateway Start: 16:47:20.6685 for engineer: 110
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:20] - Processing Call Mobile Gateway: 16:47:20.6875
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:21] - Calling Gateway Start: 16:47:21.6696 for engineer: 111
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:21] - Processing Call Mobile Gateway: 16:47:21.6716
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:22] - Calling Gateway Start: 16:47:22.6686 for engineer: 106
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:22] - Processing Call Mobile Gateway: 16:47:22.6706
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:23] - Processing Call Mobile Ended: 16:47:23.0476
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:23] - Calling Gateway End: 16:47:23.0486 for engineer: 106
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:23] - Processing Request Message: 16:47:23.0486 for engineer: 106
[MobileGateway.exe] - [Info] - [25/09/2015 16:47:23] - Message Recieved From Gateway: 16:47:23.0496
的調用應該是並行或異步處理,因爲需要同時調用此方法超過1000次,並且它們是長時間運行的進程,所以我需要一次處理多個進程。
任何想法,爲什麼我得到1響應而不是4?
不知道什麼'CallGateway'做的,這是很難說... –
添加呼叫網關。 – user3262640
好吧,我開始在那裏添加一些日誌記錄......(另外,請多注意一下你發佈的代碼 - 縮進遍佈整個地方,並且你已經完成了註釋部分那什麼都不做 - 所以基本上只是噪音。)理想情況下,想出一個*簡短的*但是完整的例子來展示正在發生的事情。 –