Avatar billede simsen Mester
14. november 2011 - 10:59 Der er 8 kommentarer og
1 løsning

Remoting Timeout

Hej,

Jeg laver remoting (med hjælp fra Arne) i et projekt. I den forbindelse, tester jeg forbindelsen og her løber jeg en i problemer.

Jeg vil frygtelig gerne sætte timeout tiden ned fra det ca. 1 minut den tager om at svare til noget mere passende. Men af en eller anden grund så er den ligeglad med jeg sætter timeout på. Kan nogen se i min TestConnection metode, hvad jeg gør forkert?

void TestConnection(object o)
        {
            if (InvokeRequired)
            {
                object[] ob = (object[])o;
                string host = (string)ob[0];
                string port = (string)ob[1];

                string toReturn = "";
               
                System.Collections.IDictionary properties = new System.Collections.Hashtable();
                //properties["connectionTimeout"] = 1 * 1000;
                properties["timeout"] = 1 * 1000;
                TcpClientChannel myTcpClientChanel = new TcpClientChannel(properties, null);

                try
                {
                    ChannelServices.RegisterChannel(myTcpClientChanel, false);
                    IConnectionService connection = (IConnectionService)Activator.GetObject(typeof(IConnectionService), "tcp://" + host + ":" + port + "/Connection");

                    toReturn = connection.GetConnection();
                }
                catch (SocketException se)
                {
                    toReturn = "Der kunne ikke oprettes forbindelse til serveren.\r\n" + se.Message.ToString();
                }
                catch (Exception ex)
                {
                    toReturn = "Der opstod en uhåndteret fejl.\r\n" + ex.Message.ToString();
                }
                finally
                {
                    if (myTcpClientChanel != null)
                    {
                        ChannelServices.UnregisterChannel(myTcpClientChanel);
                    }
                }

                this.BeginInvoke(new WaitCallback(TestConnection), toReturn);
            }
            else
            {
                //set cursor to normal
                string message = (string)o;
                this.btnCancel.Enabled = true;
                this.btnOK.Enabled = true;
                this.Cursor = Cursors.Default;
                MessageBox.Show(message);
            }
            return;
        }

mvh
simsen :-)
Avatar billede Syska Mester
14. november 2011 - 11:14 #1
Uden at være sikker ... så det eneste jeg kunne finde på nettet er at de angiver det som uint, og det ville dæleme være mærkeligt hvis det så virker.

IDictionary t = new Hashtable();
t.Add("timeout",(uint)1);
Avatar billede Syska Mester
14. november 2011 - 11:14 #2
Går selvfølgelig ud fra du ingen exceptions får i din kode.

mvh
Avatar billede simsen Mester
14. november 2011 - 11:42 #3
Hej buzzzz,

Jeg har forsøgt med dit forslag men uden held desværre.

Og jo, jeg får en SocketException, da jeg jo forsøger at hente en metode, fra en forbindelse der ikke findes:

toReturn = connection.GetConnection();

Når jeg forsøger at debugge mig igennem koden, og høreklikker ved

IConnectionService connection = (IConnectionService)Activator.GetObject(typeof(IConnectionService), "tcp://" + host + ":" + port + "/Connection");


kan jeg se følgende stå skrevet (når der ingen forbindelse er): "Items = Function evaluation timed out.".

Jeg ville så lave en en if statement udenom

toReturn = connection.GetConnection();

men der er bare ikke noget der hedder connection.Items.....så aner ikke hvordan hulen, jeg skal spørge mig ud af det, så den ikke kalder metoden, hvis der ikke er nogen forbindelse.....

mvh
simsen :-)
Avatar billede arne_v Ekspert
15. november 2011 - 00:57 #4
Som jeg laeser docs saa bruges "timeout" property kun af Http*Channel ikke af Tcp*Channel !!

http://msdn.microsoft.com/en-us/library/aa719687%28v=VS.71%29.aspx
Avatar billede arne_v Ekspert
15. november 2011 - 00:59 #5
Hm.

Det var .NET 1.1 - i 2.0 ser den ud til at vaere supporteret.

http://msdn.microsoft.com/en-us/library/bb187436%28v=vs.80%29.aspx
Avatar billede arne_v Ekspert
15. november 2011 - 01:07 #6
http://support.microsoft.com/kb/923614

skulle vaere en fix til 1.1 for at faa den til at virke ligesom 2.0.

Det er naturligvis ligegyldigt, da jeg antager at du er paa 3.5 SP1 eller 4.0.

Men der er noget interessant i eksemplet.

Hvis det eksempel skal giv mening, saa er timeout paa metode kaldet ikke paa etablering af connection !!

Og det goer jo ligesom en vis forskel.
Avatar billede simsen Mester
15. november 2011 - 15:19 #7
Aner ikke hvorfor - men det virker - det eneste jeg har gjort, er at skrive begge timeouts' - altså timeout og connectionTimeout (og ikke kun den ene af dem) på den måde buzzzz har foreslået det. Den virker i dag - på den måde, at nu venter den ikke et helt minut men kun 10-15 secs. og det er fint for mig :-)

Så pointsene må I slås om - smid et svar :-)
Avatar billede arne_v Ekspert
16. november 2011 - 00:58 #8
ingen point til mig her
Avatar billede simsen Mester
22. november 2011 - 12:45 #9
Lukker :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester