Urgent Help: Connect to multiple Servers

Feb 5 2008 8:30 PM
Hi guys,

I'm in desperate need of help with my code so if anyone could help me out it would be most appreciated:

I have built a asynchronous client / server application which runs 100% perfectly. I now want to have the client connect to multiple servers at a time so I created this class to fire off new instances of my client (passing it the target address). The class program queries my database for a list of servers to connect to periodically, it then passes the target to the worker class which actually does the work. I know my code for the worker class is correct as I've tested it (i.e. not using the class program)

I'm seeing a few errors each time this is run like for instance unable to access a disposed socket: Object name: System.Net.Sockets.Socket, at System.Net.Sockets.EndRecieve.
And also "A request to send or recieve data was disallowed because the socket is not connected" which when i check is connected.

I assume these errors occur due to interference but I'm totally stumped.
Would someone be able to show me how to get this model working please?

Code:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net.Sockets;

using System.Data.SqlClient;

using System.Data;

using System.Timers;

using System.Collections;

using System.Threading;

 

namespace DeployeeSrv

{

class Program

{

static SqlConnection connection = new SqlConnection(Properties.Settings.Default.dbConnection);

static SqlCommand command = new SqlCommand();

static SqlDataReader Reader = null;

static ArrayList al = new ArrayList();

delegate String test(String target);

 

 

static void Main(string[] args)

{

System.Timers.Timer timer = new System.Timers.Timer();

//ad 1: handle Elapsed event

timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);

timer.Interval = 60000;

timer.Enabled = true;

timer.Start();

DoWork();

Console.Read();

}

 

public static void DoWork()

{

al.Clear();

try

{

connection.Open();

command = connection.CreateCommand();

command.CommandText = "SELECT [target] from [controller].[dbo].[pending_jobs] where [Scheduled] = 0 GROUP BY [target]";

Reader = command.ExecuteReader();

while (Reader.Read())

{

//add to the array list

al.Add(Reader["target"].ToString());

}

Reader.Close();

for (int i = 0; i < al.Count; i++)

{

command.CommandText = @"UPDATE [dbo].[Pending_Jobs]

SET [Scheduled] = 1

WHERE [target] = '" + al[i].ToString() + "' and [Scheduled] = 0 ";

command.ExecuteNonQuery();

worker wk = new worker();

// create the delegate

test t = new test(wk.dostuff);

// call the delegate asynchronously

IAsyncResult result = t.BeginInvoke(al[i].ToString(), new AsyncCallback(CallbackMethod), t);

}

}

catch (SqlException ex)

{

Console.WriteLine(ex.ToString());

}

finally

{

if (connection.State == ConnectionState.Open)

{

connection.Close();

}

}

}

 

static void CallbackMethod(IAsyncResult result)

{

// get the delegate that was used to call that

// method

test t = (test)result.AsyncState;

// get the return value from that method call

//String returnValue = t.EndInvoke(result);

t.EndInvoke(result);

//Console.WriteLine("The result was " + returnValue.ToString());

}

 

private static void OnElapsedTime(object source, ElapsedEventArgs e)

{

 

DoWork();

}

 

}

}


PS:
I've uploaded a copy of the code here: http://www.downloads.sim-software.com/DeployeeSrv.rar