problem so asinhroni soketi vo C#

rated by 0 users
Not Answered This post has 0 verified answers | 2 Replies | 3 Followers

Top 25 Contributor
Points 170
Vlado87 posted on Sun, Dec 27 2009 12:43

Mnogu ednostavno scenario:

ima server i klient, koga klientot ke stisne kopce "conect" se konektiruva do serverot, i vo edna lista treba da se vnese tekst deka se konektiral (toa e problemot)

 

private void btnConect_Click(object sender, RoutedEventArgs e)

        {

            klient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint ip=new IPEndPoint(IPAddress.Parse("91.93.43.158"),9098);

            klient.BeginConnect(ip, new AsyncCallback(Conect), klient);

        }

        private void Conect(IAsyncResult rez)

        {

            Socket kl = (Socket)rez.AsyncState;

            kl.EndConnect(rez);

            IPEndPoint ip=(IPEndPoint)kl.RemoteEndPoint;

            string str = "se konektirase na serverot " + ip.Address + ":" + ip.Port;

            listChat.Items.Add(str);// poradi ovoj kod aplikacijata paga, javuva greska:

          " The calling thread cannot access this object because a different thread owns it."

        }

neznam zosto nemoze da pristapi do listata.

 

  • | Post Points: 35

All Replies

Top 10 Contributor
Points 3,800

Vlado87:

            listChat.Items.Add(str);// poradi ovoj kod aplikacijata paga, javuva greska:

          " The calling thread cannot access this object because a different thread owns it."

        }

neznam zosto nemoze da pristapi do listata.

Проблемот е едноставен: Бараш од некој thread да ти го update-ира UI елементот стартуван во друг thread. Ова во визуелното програмирање не е дозволено!

Решение: Наједноставно решение ти е да ja искористиш BackgroundWorker компонентата. Се друго бара повеќе кодирање...

There is no substitute for good architecture and design, as well as honed development skills.

  • | Post Points: 5
Top 10 Contributor
Points 585

Pocnuvajki od .net 2.0 ako pristapish na glavniot UI thread vo windows aplikacija od nekoj drug thread se dobiva Exception. Zatoa za da pristapish na nekoja UI kontrola mora da koristish Invoke. Tvojot kod kje izgleda neshto slicno na ova:

private delegate void OnConnectDelegate(IPEndPoint ip);

private void Conect(IAsyncResult rez)
{
    Socket kl = (Socket) rez.AsyncState;
    kl.EndConnect(rez);
    IPEndPoint ip = (IPEndPoint) kl.RemoteEndPoint;

   if (InvokeRequired)
   {
         BeginInvoke(new OnConnectDelegate(OnConnectMessage), new object[1] { ip});
   }
}

protected void OnConnectMessage(IPEndPoint ip)
{
   listChat.Items.Add(string.Format("Se konektirashe na serverot {0}:{1}", ip.Address, ip.Port));
}

Kako shto gledash kreirav nov metod za ispishuvanje na porakata. Ne sakav da napravam usloznuvanje na tvojot metod Connect, inaku moze i delegatot da bide so potpisot na Connect t.e. so IAsyncResult, pa da terminiranje na povikot go napravish vo slucaj koga InvokeRequired = true plus BeginInvoke do istiot metod, a vo slucaj koga InvokeRequired = false da pristapish do listata za ispishuvanje na poraka i vaka e najcesta praksa na rabota.
Koga se raboti za windows aplikacija najcesto se koristi BeginInvoke i vo retki situacii koga mozesh da si dozvolish a imash potreba, Invoke.

Ovde mozesh da vidish ubav primer za tvojot problem. Imam napishano nekolku posta na ovaa tema no searchot na msdn forumite ne e prefekten pa ne mozam da si gi najdam.

Page 1 of 1 (3 items) | RSS
Macedonian .NET User Group
Powered by Community Server (Commercial Edition), by Telligent Systems