Utworzenie nowego okna zainicjowane w innym watku c# visual

0

Witam,
pisze sobie komunikator i mam pewien problem, otóż kiedy w wątku oczekującym na połączenie próbuje otworzyć nowe okno lub wywołać metodę tworzącą okno są jakieś problemy, albo z samym oknem, albo z całym programem(odrzuca połączenia). Nie ma żadnych błędów generowanych przy kompilacji.

W prostszym programie tez okno tworzone w innym wątku nie reaguje poprawnie.

Czy możecie coś doradzić? Okno nie musi być tworzone w tym wątku, ale wydaje mi się że to on musi zainicjować stworzenie okna(nie widzę innego wyjścia z problemu).

Ps: Dodam jeszcze ze np

MessageBox.Show()

działa bez problemu, tzn wyświetla się i nie przeszkadza w pracy programu po zamknieciu.

0

poczytaj o invoke

0

Czytam o tym invoke ale ciężko mi to pojąc. Wiem ze invokeRequired zwraca true jeśli dana kontrolka jest w innym watko. Samo Invoke natomiast chyba tworzy jakąś kolejkę, jednak z praktyką jest jeszcze gorzej. Znalazłem taki przykład, kiedy chce się odnieść do kontrolki webBrowser1 z poziomu innego wątku, który działa:

delegate void SetTextHTMLCallBack(string text);
private void SetTextHTML(string tekst)
        {
            if (webBrowser1.InvokeRequired)
            {
                SetTextHTMLCallBack f = new SetTextHTMLCallBack(SetTextHTML);
                this.Invoke(f, new object[] { tekst });
            }
            else
            {
                this.webBrowser1.Document.Write(tekst);
            }
        }

Jednak nie bardzo rozumiem parametry funkcji Invoke f, new object[] { tekst } oraz jak przerobić tą metodę aby pozwalała tworzyć nowe okno z poziomu innego wątku. Próbowałem coś takiego:

Form2 noweokno = new Form2();
delegate void SetCrtWCallBack();
        private void CrtWindow()
        {
            if (noweokno.InvokeRequired)
            {
                SetCrtWCallBack s = new SetCrtWCallBack(CrtWindow);
                this.Invoke(s);
            }
            else
            {
                this.noweokno.Show();

            }
        }

Jednak sprawdziłem ze w tym przypadku InvokeRequired zawsze zwraca false poza tym this.Invoke(s) wydaje mi się podejrzane. Proszę o konkretna pomoc mam już dość szukania po necie strzępków informacji których nie potrafię złożyć w całość.

0

Gdyby kogos interesowalo rozwiazalem problem, ale zamiast uzyc invoke(nie potrafie tego zrobic, wdzieczny bylbym za przyklad z formą) uzylem:
zdarzeń związanych z backgroundworker czyli ProgressChanged przyklad tutaj:

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1