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.
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.
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.