2015-09-25 66 views
0

我用下面的代碼: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?

+0

不知道什麼'CallGateway'做的,這是很難說... –

+0

添加呼叫網關。 – user3262640

+0

好吧,我開始在那裏添加一些日誌記錄......(另外,請多注意一下你發佈的代碼 - 縮進遍佈整個地方,並且你已經完成了註釋部分那什麼都不做 - 所以基本上只是噪音。)理想情況下,想出一個*簡短的*但是完整的例子來展示正在發生的事情。 –

回答

0

由於您對代碼中的地址進行了xxx處理,所以我不能肯定地說,但這可能是因爲您以前的三個網關擁有相同的端口號6102。因此,您正在平行地關閉並打開三次同一地址的流,並且拋出異常,以便稍後默默捕獲。

此外,你可以通過在單件網關對象,如下面的提高代碼的可讀性和可維護性:

foreach (var gatewayId in gateways) 
{ 
    Task.Factory.StartNew(() => GetJobs(gatewayId)); 
} 

太修改GetJobs方法:

private string GetJobs(Gateway gateway) 
{ 
    ConfigLogger.Instance.LogInfo("info", "Calling Gateway Start: " + DateTime.Now.ToString("HH:mm:ss.ffff") + " for engineer: " + gateway.Engineer); 
    string gatewayResult = CallGateway(gateway); 
    ConfigLogger.Instance.LogInfo("info", "Calling Gateway End: " + DateTime.Now.ToString("HH:mm:ss.ffff") + " for engineer: " + gateway.Engineer); 
    if (gatewayResult != null) 
    { 
     ConfigLogger.Instance.LogInfo("info", "Processing Request Message: " + DateTime.Now.ToString("HH:mm:ss.ffff") + " for engineer: " + gateway.Engineer); 
     ProcessMessageNew(gatewayResult, gateway); 
    } 
    return gatewayResult; 
} 

而且,進一步下降,請更改您的ProcessMessageNewCallGateway,以符合上述代碼中的新定義。

+0

我認爲這是正確的。因此,所有調用相同IP和端口的Socket應該在一個連接中完成? – user3262640

+0

@ user3262640:可能只需爲每個CallGateway提供不同的端口號就可以爲你工作,看到新的端口號不會與你機器上的其他應用程序發生衝突 – displayName

+0

我無法提供不同的端口號,因爲我需要撥打3個呼叫到相同的IP和portNumber與不同的變量。IP和端口號是我打電話給的服務器,我的機器是客戶端 – user3262640